/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set et sw=2 ts=2: */ /*************************************************************************** * http.cc * * Fri Feb 24 07:58:48 CET 2012 * Copyright 2012 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of Munia. * * Munia is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Munia is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Munia; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "http.h" #include #include #include #include "hugin.hpp" int serveFile(struct lws *wsi, const std::string& file, const std::string& mimeType) { 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!? } if(ret > 0) { if(lws_http_transaction_completed(wsi) < 0) { DEBUG(httpd, "Failed to complete http transaction %s\n", file.data()); return 1; } } if(ret == 0) { DEBUG(httpd, "Http transaction of %s in progress\n", file.data()); } return 0; } 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(reason != LWS_CALLBACK_HTTP) { return 0; // We only serve http here } const char* in = (char*)i; while(*in == '/') { in++; // skip trailing slashes } std::string file; file.append(in, len - (in - (char*)i)); DEBUG(httpd,"serving HTTP URI %s\n", file.data()); // add favicon later if(file == "favicon.ico") { return serveFile(wsi, file, "image/x-icon"); } // css if(file == "munia.css") { return serveFile(wsi, file, "text/css"); } // script if(file == "proto.js" || file == "handler.js" || file == "node.js" || file == "view.js") { return serveFile(wsi, file,"text/javascript"); } 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 }