summaryrefslogtreecommitdiff
path: root/src/http.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/http.cc')
-rw-r--r--src/http.cc169
1 files changed, 82 insertions, 87 deletions
diff --git a/src/http.cc b/src/http.cc
index f00cbb7..43d09bc 100644
--- a/src/http.cc
+++ b/src/http.cc
@@ -29,107 +29,102 @@
#include <stdio.h>
#include <string.h>
+#include <string>
#include "hugin.hpp"
-int callback_http(struct libwebsocket_context * context,
- struct libwebsocket *wsi,
- enum libwebsocket_callback_reasons reason, void *user,
- void *i, size_t len)
+int serveFile(struct lws *wsi,
+ const std::string& file, const std::string& mimeType)
{
- char *in = (char*)i;
- // char client_name[128];
- // char client_ip[128];
-
- switch(reason) {
- case LWS_CALLBACK_HTTP:
- DEBUG(httpd,"serving HTTP URI %s\n", (char *)in);
-
- while(*in == '/') in++; // skip trailing slashes
-
- // add favicon later
- if(in && strcmp((const char *)in, "favicon.ico") == 0) {
- if(libwebsockets_serve_http_file(context, wsi,
- LOCAL_RESOURCE_PATH"/favicon.ico",
- "image/x-icon"))
- DEBUG(httpd,"Failed to send favicon\n");
- break;
- }
+ std::string fileWithPath = LOCAL_RESOURCE_PATH;
+ fileWithPath += "/" + file;
+ auto ret = lws_serve_http_file(wsi, fileWithPath.data(),
+ mimeType.data(), nullptr, 0);
+ if(ret < 0)
+ {
+ DEBUG(httpd, "Failed to serve %s\n", file.data());
+ return 1; // error!?
+ }
- // css
- if(in && strcmp((const char *)in, "munia.css") == 0) {
- if(libwebsockets_serve_http_file(context, wsi,
- LOCAL_RESOURCE_PATH"/munia.css",
- "text/css"))
- DEBUG(httpd,"Failed to send css\n");
- break;
+ if(ret > 0)
+ {
+ if(lws_http_transaction_completed(wsi) < 0)
+ {
+ DEBUG(httpd, "Failed to complete http transaction %s\n", file.data());
+ return 1;
}
+ }
- // script
- if(in && strcmp((const char *)in, "proto.js") == 0) {
- if(libwebsockets_serve_http_file(context, wsi,
- LOCAL_RESOURCE_PATH"/proto.js",
- "text/javascript"))
- DEBUG(httpd,"Failed to send javascript\n");
- break;
- }
+ if(ret == 0)
+ {
+ DEBUG(httpd, "Http transaction of %s in progress\n", file.data());
+ }
- if(in && strcmp((const char *)in, "handler.js") == 0) {
- if(libwebsockets_serve_http_file(context, wsi,
- LOCAL_RESOURCE_PATH"/handler.js",
- "text/javascript"))
- DEBUG(httpd,"Failed to send javascript\n");
- break;
- }
+ return 0;
+}
- if(in && strcmp((const char *)in, "view.js") == 0) {
- if(libwebsockets_serve_http_file(context, wsi,
- LOCAL_RESOURCE_PATH"/view.js",
- "text/javascript"))
- DEBUG(httpd,"Failed to send javascript\n");
- break;
- }
+int callback_http(struct lws *wsi,
+ enum lws_callback_reasons reason, void *user,
+ void *i, size_t len)
+{
+ // char client_name[128];
+ // char client_ip[128];
- if(in && strcmp((const char *)in, "task.js") == 0) {
- if(libwebsockets_serve_http_file(context, wsi,
- LOCAL_RESOURCE_PATH"/task.js",
- "text/javascript"))
- DEBUG(httpd,"Failed to send javascript\n");
- break;
- }
+ if(reason != LWS_CALLBACK_HTTP)
+ {
+ return 0; // We only serve http here
+ }
+ const char* in = (char*)i;
+ while(*in == '/')
+ {
+ in++; // skip trailing slashes
+ }
- /* send the script... when it runs it'll start websockets */
- if(libwebsockets_serve_http_file(context, wsi,
- LOCAL_RESOURCE_PATH"/munia.html",
- "text/html"))
- DEBUG(httpd,"Failed to send HTTP file\n");
- break;
+ std::string file;
+ file.append(in, len - (in - (char*)i));
+ DEBUG(httpd,"serving HTTP URI %s\n", file.data());
- /*
- * callback for confirming to continue with client IP appear in
- * protocol 0 callback since no websocket protocol has been agreed
- * yet. You can just ignore this if you won't filter on client IP
- * since the default uhandled callback return is 0 meaning let the
- * connection continue.
- */
+ // add favicon later
+ if(file == "favicon.ico")
+ {
+ return serveFile(wsi, file, "image/x-icon");
+ }
- case LWS_CALLBACK_FILTER_NETWORK_CONNECTION:
- /*
- libwebsockets_get_peer_addresses((int)(long)user,
- client_name,
- sizeof(client_name),
- client_ip,
- sizeof(client_ip));
- DEBUG(httpd,"Received network connect from %s (%s)\n",
- client_name, client_ip);
- */
- /* if we returned non-zero from here, we kill the connection */
- break;
+ // css
+ if(file == "munia.css")
+ {
+ return serveFile(wsi, file, "text/css");
+ }
- default:
- break;
+ // script
+ if(file == "proto.js" ||
+ file == "handler.js" ||
+ file == "task.js" ||
+ file == "view.js")
+ {
+ return serveFile(wsi, file,"text/javascript");
}
-
- return 0;
+
+ return serveFile(wsi, "munia.html", "text/html");
+
+#if 0
+ // callback for confirming to continue with client IP appear in
+ // protocol 0 callback since no websocket protocol has been agreed
+ // yet. You can just ignore this if you won't filter on client IP
+ // since the default uhandled callback return is 0 meaning let the
+ // connection continue.
+
+ case LWS_CALLBACK_FILTER_NETWORK_CONNECTION:
+ //lws_get_peer_addresses((int)(long)user,
+ // client_name,
+ // sizeof(client_name),
+ // client_ip,
+ // sizeof(client_ip));
+ //DEBUG(httpd,"Received network connect from %s (%s)\n",
+ // client_name, client_ip);
+
+ // if we returned non-zero from here, we kill the connection
+ break;
+#endif
}