mirror of
https://github.com/aseprite/aseprite.git
synced 2024-09-03 13:39:02 +00:00
Add HTTP webserver feature (for testing only at the moment)
This commit is contained in:
parent
ce6b186e1b
commit
2364776c44
@ -41,6 +41,7 @@ option(USE_SHARED_GTEST "Use your installed copy of gtest" off)
|
|||||||
option(USE_SHARED_ALLEGRO4 "Use shared Allegro 4 library (without resize support)" off)
|
option(USE_SHARED_ALLEGRO4 "Use shared Allegro 4 library (without resize support)" off)
|
||||||
option(ENABLE_MEMLEAK "Enable memory-leaks detector (only for developers)" off)
|
option(ENABLE_MEMLEAK "Enable memory-leaks detector (only for developers)" off)
|
||||||
option(ENABLE_UPDATER "Enable automatic check for updates" on)
|
option(ENABLE_UPDATER "Enable automatic check for updates" on)
|
||||||
|
option(ENABLE_WEBSERVER "Enable support to run a webserver (for HTML5 gamedev)" off)
|
||||||
option(FULLSCREEN_PLATFORM "Enable fullscreen by default" off)
|
option(FULLSCREEN_PLATFORM "Enable fullscreen by default" off)
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
@ -80,6 +81,7 @@ set(LIBFREETYPE_DIR ${CMAKE_SOURCE_DIR}/third_party/freetype)
|
|||||||
set(LIBJPEG_DIR ${CMAKE_SOURCE_DIR}/third_party/jpeg)
|
set(LIBJPEG_DIR ${CMAKE_SOURCE_DIR}/third_party/jpeg)
|
||||||
set(LIBPNG_DIR ${CMAKE_SOURCE_DIR}/third_party/libpng)
|
set(LIBPNG_DIR ${CMAKE_SOURCE_DIR}/third_party/libpng)
|
||||||
set(LOADPNG_DIR ${CMAKE_SOURCE_DIR}/third_party/loadpng)
|
set(LOADPNG_DIR ${CMAKE_SOURCE_DIR}/third_party/loadpng)
|
||||||
|
set(MONGOOSE_DIR ${CMAKE_SOURCE_DIR}/third_party/mongoose)
|
||||||
set(TINYXML_DIR ${CMAKE_SOURCE_DIR}/third_party/tinyxml)
|
set(TINYXML_DIR ${CMAKE_SOURCE_DIR}/third_party/tinyxml)
|
||||||
set(ZLIB_DIR ${CMAKE_SOURCE_DIR}/third_party/zlib)
|
set(ZLIB_DIR ${CMAKE_SOURCE_DIR}/third_party/zlib)
|
||||||
|
|
||||||
|
@ -87,6 +87,7 @@ of the following projects created by third-parties:
|
|||||||
* [GIMP](http://www.gimp.org/) - [GPL license](https://github.com/dacap/aseprite/tree/master/docs/licenses/GPL.txt)
|
* [GIMP](http://www.gimp.org/) - [GPL license](https://github.com/dacap/aseprite/tree/master/docs/licenses/GPL.txt)
|
||||||
* [GTK+](http://www.gtk.org/) - [LGPL license](https://github.com/dacap/aseprite/tree/master/docs/licenses/LGPL-2.1.txt)
|
* [GTK+](http://www.gtk.org/) - [LGPL license](https://github.com/dacap/aseprite/tree/master/docs/licenses/LGPL-2.1.txt)
|
||||||
* [Google Test](http://code.google.com/p/googletest/) - [gtest license](https://github.com/dacap/aseprite/tree/master/docs/licenses/gtest-LICENSE.txt)
|
* [Google Test](http://code.google.com/p/googletest/) - [gtest license](https://github.com/dacap/aseprite/tree/master/docs/licenses/gtest-LICENSE.txt)
|
||||||
|
* [mongoose](https://github.com/valenok/mongoose) - [MIT license](https://github.com/valenok/mongoose/blob/master/LICENSE)
|
||||||
* [libart](http://www.levien.com/libart/) - [LGPL license](https://github.com/dacap/aseprite/tree/master/docs/licenses/LGPL-2.0.txt)
|
* [libart](http://www.levien.com/libart/) - [LGPL license](https://github.com/dacap/aseprite/tree/master/docs/licenses/LGPL-2.0.txt)
|
||||||
* [libjpeg](http://www.ijg.org/) - [libjpeg license](https://github.com/dacap/aseprite/tree/master/docs/licenses/libjpeg-LICENSE.txt)
|
* [libjpeg](http://www.ijg.org/) - [libjpeg license](https://github.com/dacap/aseprite/tree/master/docs/licenses/libjpeg-LICENSE.txt)
|
||||||
* [libpng](http://www.libpng.org/pub/png/) - [libpng license](https://github.com/dacap/aseprite/tree/master/docs/licenses/libpng-LICENSE.txt)
|
* [libpng](http://www.libpng.org/pub/png/) - [libpng license](https://github.com/dacap/aseprite/tree/master/docs/licenses/libpng-LICENSE.txt)
|
||||||
|
@ -112,6 +112,16 @@ if(ENABLE_UPDATER)
|
|||||||
add_subdirectory(updater)
|
add_subdirectory(updater)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(ENABLE_WEBSERVER)
|
||||||
|
set(libs3rdparty ${libs3rdparty} mongoose)
|
||||||
|
include_directories(${MONGOOSE_DIR})
|
||||||
|
|
||||||
|
set(aseprite_libraries ${aseprite_libraries} webserver-lib)
|
||||||
|
add_definitions(-DENABLE_WEBSERVER)
|
||||||
|
|
||||||
|
add_subdirectory(webserver)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(USE_SHARED_ALLEGRO4)
|
if(USE_SHARED_ALLEGRO4)
|
||||||
# Find the shared Allegro 4 library
|
# Find the shared Allegro 4 library
|
||||||
find_library(LIBALLEGRO4_LIBRARY alleg)
|
find_library(LIBALLEGRO4_LIBRARY alleg)
|
||||||
@ -194,6 +204,7 @@ add_library(aseprite-library
|
|||||||
app/data_recovery.cpp
|
app/data_recovery.cpp
|
||||||
app/file_selector.cpp
|
app/file_selector.cpp
|
||||||
app/project.cpp
|
app/project.cpp
|
||||||
|
app/webserver.cpp
|
||||||
app/widget_loader.cpp
|
app/widget_loader.cpp
|
||||||
commands/cmd_about.cpp
|
commands/cmd_about.cpp
|
||||||
commands/cmd_advanced_mode.cpp
|
commands/cmd_advanced_mode.cpp
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "app/data_recovery.h"
|
#include "app/data_recovery.h"
|
||||||
#include "app/find_widget.h"
|
#include "app/find_widget.h"
|
||||||
#include "app/load_widget.h"
|
#include "app/load_widget.h"
|
||||||
|
#include "app/webserver.h"
|
||||||
#include "base/exception.h"
|
#include "base/exception.h"
|
||||||
#include "base/unique_ptr.h"
|
#include "base/unique_ptr.h"
|
||||||
#include "commands/commands.h"
|
#include "commands/commands.h"
|
||||||
@ -211,6 +212,12 @@ int App::run()
|
|||||||
checkUpdate.launch();
|
checkUpdate.launch();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_WEBSERVER
|
||||||
|
// Launch the webserver.
|
||||||
|
app::WebServer webServer;
|
||||||
|
webServer.start();
|
||||||
|
#endif
|
||||||
|
|
||||||
// Run the GUI main message loop
|
// Run the GUI main message loop
|
||||||
gui_run();
|
gui_run();
|
||||||
|
|
||||||
|
46
src/app/webserver.cpp
Normal file
46
src/app/webserver.cpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/* ASEPRITE
|
||||||
|
* Copyright (C) 2001-2013 David Capello
|
||||||
|
*
|
||||||
|
* This program 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.
|
||||||
|
*
|
||||||
|
* This program 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 this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#ifdef ENABLE_WEBSERVER
|
||||||
|
|
||||||
|
#include "app/webserver.h"
|
||||||
|
|
||||||
|
#include "webserver/webserver.h"
|
||||||
|
|
||||||
|
namespace app {
|
||||||
|
|
||||||
|
WebServer::WebServer()
|
||||||
|
: m_webServer(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WebServer::~WebServer()
|
||||||
|
{
|
||||||
|
delete m_webServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebServer::start()
|
||||||
|
{
|
||||||
|
m_webServer = new webserver::WebServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // ENABLE_WEBSERVER
|
44
src/app/webserver.h
Normal file
44
src/app/webserver.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/* ASEPRITE
|
||||||
|
* Copyright (C) 2001-2013 David Capello
|
||||||
|
*
|
||||||
|
* This program 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.
|
||||||
|
*
|
||||||
|
* This program 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 this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef APP_WEBSERVER_H_INCLUDED
|
||||||
|
#define APP_WEBSERVER_H_INCLUDED
|
||||||
|
|
||||||
|
#ifdef ENABLE_WEBSERVER
|
||||||
|
|
||||||
|
#include "webserver/webserver.h"
|
||||||
|
|
||||||
|
namespace app {
|
||||||
|
|
||||||
|
class WebServer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WebServer();
|
||||||
|
~WebServer();
|
||||||
|
|
||||||
|
void start();
|
||||||
|
|
||||||
|
private:
|
||||||
|
webserver::WebServer* m_webServer;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // ENABLE_WEBSERVER
|
||||||
|
|
||||||
|
#endif // APP_WEBSERVER_H_INCLUDED
|
5
src/webserver/CMakeLists.txt
Normal file
5
src/webserver/CMakeLists.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# ASEPRITE
|
||||||
|
# Copyright (C) 2001-2013 David Capello
|
||||||
|
|
||||||
|
add_library(webserver-lib
|
||||||
|
webserver.cpp)
|
92
src/webserver/webserver.cpp
Normal file
92
src/webserver/webserver.cpp
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
/* ASEPRITE
|
||||||
|
* Copyright (C) 2001-2013 David Capello
|
||||||
|
*
|
||||||
|
* This program 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.
|
||||||
|
*
|
||||||
|
* This program 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 this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "webserver/webserver.h"
|
||||||
|
|
||||||
|
#include "base/bind.h"
|
||||||
|
#include "mongoose.h"
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
namespace webserver {
|
||||||
|
|
||||||
|
static int begin_request_handler(mg_connection* conn);
|
||||||
|
|
||||||
|
class WebServer::WebServerImpl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WebServerImpl() {
|
||||||
|
const char* options[] = { "listening_ports", "10453", NULL};
|
||||||
|
|
||||||
|
memset(&m_callbacks, 0, sizeof(m_callbacks));
|
||||||
|
m_callbacks.begin_request = &begin_request_handler;
|
||||||
|
|
||||||
|
m_context = mg_start(&m_callbacks, (void*)this, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
~WebServerImpl() {
|
||||||
|
mg_stop(m_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
int onBeginRequest(mg_connection* conn) {
|
||||||
|
const mg_request_info* request_info = mg_get_request_info(conn);
|
||||||
|
std::stringstream content;
|
||||||
|
|
||||||
|
// Prepare the message we're going to send
|
||||||
|
content << PACKAGE << " v" << VERSION;
|
||||||
|
|
||||||
|
// Send HTTP reply to the client
|
||||||
|
std::string contentStr = content.str();
|
||||||
|
mg_printf(conn,
|
||||||
|
"HTTP/1.1 200 OK\r\n"
|
||||||
|
"Content-Type: text/plain\r\n"
|
||||||
|
"Content-Length: %d\r\n"
|
||||||
|
"\r\n"
|
||||||
|
"%s",
|
||||||
|
contentStr.size(), contentStr.c_str());
|
||||||
|
|
||||||
|
// Returning non-zero tells mongoose that our function has replied to
|
||||||
|
// the client, and mongoose should not send client any more data.
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mg_context* m_context;
|
||||||
|
mg_callbacks m_callbacks;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int begin_request_handler(mg_connection* conn)
|
||||||
|
{
|
||||||
|
const mg_request_info* request_info = mg_get_request_info(conn);
|
||||||
|
WebServer::WebServerImpl* webServer = reinterpret_cast<WebServer::WebServerImpl*>(request_info->user_data);
|
||||||
|
return webServer->onBeginRequest(conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
WebServer::WebServer()
|
||||||
|
: m_impl(new WebServerImpl)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WebServer::~WebServer()
|
||||||
|
{
|
||||||
|
delete m_impl;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
42
src/webserver/webserver.h
Normal file
42
src/webserver/webserver.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/* ASEPRITE
|
||||||
|
* Copyright (C) 2001-2013 David Capello
|
||||||
|
*
|
||||||
|
* This program 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.
|
||||||
|
*
|
||||||
|
* This program 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 this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WEBSERVER_WEBSERVER_H_INCLUDED
|
||||||
|
#define WEBSERVER_WEBSERVER_H_INCLUDED
|
||||||
|
|
||||||
|
#include "base/disable_copying.h"
|
||||||
|
|
||||||
|
namespace webserver {
|
||||||
|
|
||||||
|
class WebServer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class WebServerImpl;
|
||||||
|
|
||||||
|
WebServer();
|
||||||
|
~WebServer();
|
||||||
|
|
||||||
|
private:
|
||||||
|
WebServerImpl* m_impl;
|
||||||
|
|
||||||
|
DISABLE_COPYING(WebServer);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace webserver
|
||||||
|
|
||||||
|
#endif
|
4
third_party/CMakeLists.txt
vendored
4
third_party/CMakeLists.txt
vendored
@ -39,3 +39,7 @@ endif()
|
|||||||
if(NOT USE_SHARED_LIBLOADPNG)
|
if(NOT USE_SHARED_LIBLOADPNG)
|
||||||
add_subdirectory(loadpng)
|
add_subdirectory(loadpng)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(ENABLE_WEBSERVER)
|
||||||
|
add_subdirectory(mongoose)
|
||||||
|
endif()
|
||||||
|
5
third_party/mongoose/CMakeLists.txt
vendored
Normal file
5
third_party/mongoose/CMakeLists.txt
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# ASEPRITE
|
||||||
|
# Copyright (C) 2001-2013 David Capello
|
||||||
|
|
||||||
|
add_library(mongoose
|
||||||
|
mongoose.c)
|
19
third_party/mongoose/LICENSE
vendored
Normal file
19
third_party/mongoose/LICENSE
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Copyright (c) 2004-2013 Sergey Lyubka
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
5385
third_party/mongoose/mongoose.c
vendored
Normal file
5385
third_party/mongoose/mongoose.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
350
third_party/mongoose/mongoose.h
vendored
Normal file
350
third_party/mongoose/mongoose.h
vendored
Normal file
@ -0,0 +1,350 @@
|
|||||||
|
// Copyright (c) 2004-2012 Sergey Lyubka
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
#ifndef MONGOOSE_HEADER_INCLUDED
|
||||||
|
#define MONGOOSE_HEADER_INCLUDED
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
struct mg_context; // Handle for the HTTP service itself
|
||||||
|
struct mg_connection; // Handle for the individual connection
|
||||||
|
|
||||||
|
|
||||||
|
// This structure contains information about the HTTP request.
|
||||||
|
struct mg_request_info {
|
||||||
|
const char *request_method; // "GET", "POST", etc
|
||||||
|
const char *uri; // URL-decoded URI
|
||||||
|
const char *http_version; // E.g. "1.0", "1.1"
|
||||||
|
const char *query_string; // URL part after '?', not including '?', or NULL
|
||||||
|
const char *remote_user; // Authenticated user, or NULL if no auth used
|
||||||
|
long remote_ip; // Client's IP address
|
||||||
|
int remote_port; // Client's port
|
||||||
|
int is_ssl; // 1 if SSL-ed, 0 if not
|
||||||
|
void *user_data; // User data pointer passed to mg_start()
|
||||||
|
|
||||||
|
int num_headers; // Number of HTTP headers
|
||||||
|
struct mg_header {
|
||||||
|
const char *name; // HTTP header name
|
||||||
|
const char *value; // HTTP header value
|
||||||
|
} http_headers[64]; // Maximum 64 headers
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// This structure needs to be passed to mg_start(), to let mongoose know
|
||||||
|
// which callbacks to invoke. For detailed description, see
|
||||||
|
// https://github.com/valenok/mongoose/blob/master/UserManual.md
|
||||||
|
struct mg_callbacks {
|
||||||
|
// Called when mongoose has received new HTTP request.
|
||||||
|
// If callback returns non-zero,
|
||||||
|
// callback must process the request by sending valid HTTP headers and body,
|
||||||
|
// and mongoose will not do any further processing.
|
||||||
|
// If callback returns 0, mongoose processes the request itself. In this case,
|
||||||
|
// callback must not send any data to the client.
|
||||||
|
int (*begin_request)(struct mg_connection *);
|
||||||
|
|
||||||
|
// Called when mongoose has finished processing request.
|
||||||
|
void (*end_request)(const struct mg_connection *, int reply_status_code);
|
||||||
|
|
||||||
|
// Called when mongoose is about to log a message. If callback returns
|
||||||
|
// non-zero, mongoose does not log anything.
|
||||||
|
int (*log_message)(const struct mg_connection *, const char *message);
|
||||||
|
|
||||||
|
// Called when mongoose initializes SSL library.
|
||||||
|
int (*init_ssl)(void *ssl_context, void *user_data);
|
||||||
|
|
||||||
|
// Called when websocket request is received, before websocket handshake.
|
||||||
|
// If callback returns 0, mongoose proceeds with handshake, otherwise
|
||||||
|
// cinnection is closed immediately.
|
||||||
|
int (*websocket_connect)(const struct mg_connection *);
|
||||||
|
|
||||||
|
// Called when websocket handshake is successfully completed, and
|
||||||
|
// connection is ready for data exchange.
|
||||||
|
void (*websocket_ready)(struct mg_connection *);
|
||||||
|
|
||||||
|
// Called when data frame has been received from the client.
|
||||||
|
// Parameters:
|
||||||
|
// bits: first byte of the websocket frame, see websocket RFC at
|
||||||
|
// http://tools.ietf.org/html/rfc6455, section 5.2
|
||||||
|
// data, data_len: payload, with mask (if any) already applied.
|
||||||
|
// Return value:
|
||||||
|
// 0: keep this websocket connection opened.
|
||||||
|
// non-0: close this websocket connection.
|
||||||
|
int (*websocket_data)(struct mg_connection *, int bits,
|
||||||
|
char *data, size_t data_len);
|
||||||
|
|
||||||
|
// Called when mongoose tries to open a file. Used to intercept file open
|
||||||
|
// calls, and serve file data from memory instead.
|
||||||
|
// Parameters:
|
||||||
|
// path: Full path to the file to open.
|
||||||
|
// data_len: Placeholder for the file size, if file is served from memory.
|
||||||
|
// Return value:
|
||||||
|
// NULL: do not serve file from memory, proceed with normal file open.
|
||||||
|
// non-NULL: pointer to the file contents in memory. data_len must be
|
||||||
|
// initilized with the size of the memory block.
|
||||||
|
const char * (*open_file)(const struct mg_connection *,
|
||||||
|
const char *path, size_t *data_len);
|
||||||
|
|
||||||
|
// Called when mongoose is about to serve Lua server page (.lp file), if
|
||||||
|
// Lua support is enabled.
|
||||||
|
// Parameters:
|
||||||
|
// lua_context: "lua_State *" pointer.
|
||||||
|
void (*init_lua)(struct mg_connection *, void *lua_context);
|
||||||
|
|
||||||
|
// Called when mongoose has uploaded a file to a temporary directory as a
|
||||||
|
// result of mg_upload() call.
|
||||||
|
// Parameters:
|
||||||
|
// file_file: full path name to the uploaded file.
|
||||||
|
void (*upload)(struct mg_connection *, const char *file_name);
|
||||||
|
|
||||||
|
// Called when mongoose is about to send HTTP error to the client.
|
||||||
|
// Implementing this callback allows to create custom error pages.
|
||||||
|
// Parameters:
|
||||||
|
// status: HTTP error status code.
|
||||||
|
int (*http_error)(struct mg_connection *, int status);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Start web server.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// callbacks: mg_callbacks structure with user-defined callbacks.
|
||||||
|
// options: NULL terminated list of option_name, option_value pairs that
|
||||||
|
// specify Mongoose configuration parameters.
|
||||||
|
//
|
||||||
|
// Side-effects: on UNIX, ignores SIGCHLD and SIGPIPE signals. If custom
|
||||||
|
// processing is required for these, signal handlers must be set up
|
||||||
|
// after calling mg_start().
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// const char *options[] = {
|
||||||
|
// "document_root", "/var/www",
|
||||||
|
// "listening_ports", "80,443s",
|
||||||
|
// NULL
|
||||||
|
// };
|
||||||
|
// struct mg_context *ctx = mg_start(&my_func, NULL, options);
|
||||||
|
//
|
||||||
|
// Refer to https://github.com/valenok/mongoose/blob/master/UserManual.md
|
||||||
|
// for the list of valid option and their possible values.
|
||||||
|
//
|
||||||
|
// Return:
|
||||||
|
// web server context, or NULL on error.
|
||||||
|
struct mg_context *mg_start(const struct mg_callbacks *callbacks,
|
||||||
|
void *user_data,
|
||||||
|
const char **configuration_options);
|
||||||
|
|
||||||
|
|
||||||
|
// Stop the web server.
|
||||||
|
//
|
||||||
|
// Must be called last, when an application wants to stop the web server and
|
||||||
|
// release all associated resources. This function blocks until all Mongoose
|
||||||
|
// threads are stopped. Context pointer becomes invalid.
|
||||||
|
void mg_stop(struct mg_context *);
|
||||||
|
|
||||||
|
|
||||||
|
// Get the value of particular configuration parameter.
|
||||||
|
// The value returned is read-only. Mongoose does not allow changing
|
||||||
|
// configuration at run time.
|
||||||
|
// If given parameter name is not valid, NULL is returned. For valid
|
||||||
|
// names, return value is guaranteed to be non-NULL. If parameter is not
|
||||||
|
// set, zero-length string is returned.
|
||||||
|
const char *mg_get_option(const struct mg_context *ctx, const char *name);
|
||||||
|
|
||||||
|
|
||||||
|
// Return array of strings that represent valid configuration options.
|
||||||
|
// For each option, a short name, long name, and default value is returned.
|
||||||
|
// Array is NULL terminated.
|
||||||
|
const char **mg_get_valid_option_names(void);
|
||||||
|
|
||||||
|
|
||||||
|
// Add, edit or delete the entry in the passwords file.
|
||||||
|
//
|
||||||
|
// This function allows an application to manipulate .htpasswd files on the
|
||||||
|
// fly by adding, deleting and changing user records. This is one of the
|
||||||
|
// several ways of implementing authentication on the server side. For another,
|
||||||
|
// cookie-based way please refer to the examples/chat.c in the source tree.
|
||||||
|
//
|
||||||
|
// If password is not NULL, entry is added (or modified if already exists).
|
||||||
|
// If password is NULL, entry is deleted.
|
||||||
|
//
|
||||||
|
// Return:
|
||||||
|
// 1 on success, 0 on error.
|
||||||
|
int mg_modify_passwords_file(const char *passwords_file_name,
|
||||||
|
const char *domain,
|
||||||
|
const char *user,
|
||||||
|
const char *password);
|
||||||
|
|
||||||
|
|
||||||
|
// Return information associated with the request.
|
||||||
|
struct mg_request_info *mg_get_request_info(struct mg_connection *);
|
||||||
|
|
||||||
|
|
||||||
|
// Send data to the client.
|
||||||
|
// Return:
|
||||||
|
// 0 when the connection has been closed
|
||||||
|
// -1 on error
|
||||||
|
// >0 number of bytes written on success
|
||||||
|
int mg_write(struct mg_connection *, const void *buf, size_t len);
|
||||||
|
|
||||||
|
|
||||||
|
// Macros for enabling compiler-specific checks for printf-like arguments.
|
||||||
|
#undef PRINTF_FORMAT_STRING
|
||||||
|
#if _MSC_VER >= 1400
|
||||||
|
#include <sal.h>
|
||||||
|
#if _MSC_VER > 1400
|
||||||
|
#define PRINTF_FORMAT_STRING(s) _Printf_format_string_ s
|
||||||
|
#else
|
||||||
|
#define PRINTF_FORMAT_STRING(s) __format_string s
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define PRINTF_FORMAT_STRING(s) s
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define PRINTF_ARGS(x, y) __attribute__((format(printf, x, y)))
|
||||||
|
#else
|
||||||
|
#define PRINTF_ARGS(x, y)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Send data to the client using printf() semantics.
|
||||||
|
//
|
||||||
|
// Works exactly like mg_write(), but allows to do message formatting.
|
||||||
|
int mg_printf(struct mg_connection *,
|
||||||
|
PRINTF_FORMAT_STRING(const char *fmt), ...) PRINTF_ARGS(2, 3);
|
||||||
|
|
||||||
|
|
||||||
|
// Send contents of the entire file together with HTTP headers.
|
||||||
|
void mg_send_file(struct mg_connection *conn, const char *path);
|
||||||
|
|
||||||
|
|
||||||
|
// Read data from the remote end, return number of bytes read.
|
||||||
|
int mg_read(struct mg_connection *, void *buf, size_t len);
|
||||||
|
|
||||||
|
|
||||||
|
// Get the value of particular HTTP header.
|
||||||
|
//
|
||||||
|
// This is a helper function. It traverses request_info->http_headers array,
|
||||||
|
// and if the header is present in the array, returns its value. If it is
|
||||||
|
// not present, NULL is returned.
|
||||||
|
const char *mg_get_header(const struct mg_connection *, const char *name);
|
||||||
|
|
||||||
|
|
||||||
|
// Get a value of particular form variable.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// data: pointer to form-uri-encoded buffer. This could be either POST data,
|
||||||
|
// or request_info.query_string.
|
||||||
|
// data_len: length of the encoded data.
|
||||||
|
// var_name: variable name to decode from the buffer
|
||||||
|
// dst: destination buffer for the decoded variable
|
||||||
|
// dst_len: length of the destination buffer
|
||||||
|
//
|
||||||
|
// Return:
|
||||||
|
// On success, length of the decoded variable.
|
||||||
|
// On error:
|
||||||
|
// -1 (variable not found).
|
||||||
|
// -2 (destination buffer is NULL, zero length or too small to hold the
|
||||||
|
// decoded variable).
|
||||||
|
//
|
||||||
|
// Destination buffer is guaranteed to be '\0' - terminated if it is not
|
||||||
|
// NULL or zero length.
|
||||||
|
int mg_get_var(const char *data, size_t data_len,
|
||||||
|
const char *var_name, char *dst, size_t dst_len);
|
||||||
|
|
||||||
|
// Fetch value of certain cookie variable into the destination buffer.
|
||||||
|
//
|
||||||
|
// Destination buffer is guaranteed to be '\0' - terminated. In case of
|
||||||
|
// failure, dst[0] == '\0'. Note that RFC allows many occurrences of the same
|
||||||
|
// parameter. This function returns only first occurrence.
|
||||||
|
//
|
||||||
|
// Return:
|
||||||
|
// On success, value length.
|
||||||
|
// On error:
|
||||||
|
// -1 (either "Cookie:" header is not present at all or the requested
|
||||||
|
// parameter is not found).
|
||||||
|
// -2 (destination buffer is NULL, zero length or too small to hold the
|
||||||
|
// value).
|
||||||
|
int mg_get_cookie(const struct mg_connection *,
|
||||||
|
const char *cookie_name, char *buf, size_t buf_len);
|
||||||
|
|
||||||
|
|
||||||
|
// Download data from the remote web server.
|
||||||
|
// host: host name to connect to, e.g. "foo.com", or "10.12.40.1".
|
||||||
|
// port: port number, e.g. 80.
|
||||||
|
// use_ssl: wether to use SSL connection.
|
||||||
|
// error_buffer, error_buffer_size: error message placeholder.
|
||||||
|
// request_fmt,...: HTTP request.
|
||||||
|
// Return:
|
||||||
|
// On success, valid pointer to the new connection, suitable for mg_read().
|
||||||
|
// On error, NULL. error_buffer contains error message.
|
||||||
|
// Example:
|
||||||
|
// char ebuf[100];
|
||||||
|
// struct mg_connection *conn;
|
||||||
|
// conn = mg_download("google.com", 80, 0, ebuf, sizeof(ebuf),
|
||||||
|
// "%s", "GET / HTTP/1.0\r\nHost: google.com\r\n\r\n");
|
||||||
|
struct mg_connection *mg_download(const char *host, int port, int use_ssl,
|
||||||
|
char *error_buffer, size_t error_buffer_size,
|
||||||
|
PRINTF_FORMAT_STRING(const char *request_fmt),
|
||||||
|
...) PRINTF_ARGS(6, 7);
|
||||||
|
|
||||||
|
|
||||||
|
// Close the connection opened by mg_download().
|
||||||
|
void mg_close_connection(struct mg_connection *conn);
|
||||||
|
|
||||||
|
|
||||||
|
// File upload functionality. Each uploaded file gets saved into a temporary
|
||||||
|
// file and MG_UPLOAD event is sent.
|
||||||
|
// Return number of uploaded files.
|
||||||
|
int mg_upload(struct mg_connection *conn, const char *destination_dir);
|
||||||
|
|
||||||
|
|
||||||
|
// Convenience function -- create detached thread.
|
||||||
|
// Return: 0 on success, non-0 on error.
|
||||||
|
typedef void * (*mg_thread_func_t)(void *);
|
||||||
|
int mg_start_thread(mg_thread_func_t f, void *p);
|
||||||
|
|
||||||
|
|
||||||
|
// Return builtin mime type for the given file name.
|
||||||
|
// For unrecognized extensions, "text/plain" is returned.
|
||||||
|
const char *mg_get_builtin_mime_type(const char *file_name);
|
||||||
|
|
||||||
|
|
||||||
|
// Return Mongoose version.
|
||||||
|
const char *mg_version(void);
|
||||||
|
|
||||||
|
|
||||||
|
// MD5 hash given strings.
|
||||||
|
// Buffer 'buf' must be 33 bytes long. Varargs is a NULL terminated list of
|
||||||
|
// ASCIIz strings. When function returns, buf will contain human-readable
|
||||||
|
// MD5 hash. Example:
|
||||||
|
// char buf[33];
|
||||||
|
// mg_md5(buf, "aa", "bb", NULL);
|
||||||
|
char *mg_md5(char buf[33], ...);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
#endif // MONGOOSE_HEADER_INCLUDED
|
Loading…
Reference in New Issue
Block a user