#include #include #include #include #include #include #include #include #include #include /* int ts_http_respond(short event, ad_conn_t *conn, void *userdata) { if (event & AD_EVENT_READ) { if (ad_http_get_status(conn) == AD_HTTP_REQ_DONE) { ad_http_response(conn, 200, "text/html", "Hello World", 11); return ad_http_is_keepalive_request(conn) ? AD_DONE : AD_CLOSE; } } return AD_OK; } int http_default_handler(short event, ad_conn_t *conn, void *userdata) { if (event & AD_EVENT_READ) { if (ad_http_get_status(conn) == AD_HTTP_REQ_DONE) { ad_http_response(conn, 501, "text/html", "Not implemented", 15); return AD_CLOSE; // Close connection. } } return AD_OK; } */ // This function will be called by civetweb on every new request. static int begin_request_handler(struct mg_connection *conn) { const struct mg_request_info *request_info = mg_get_request_info(conn); char content[100]; // Prepare the message we're going to send int content_length = snprintf(content, sizeof(content), "Hello from civetweb! Remote port: %d", request_info->remote_port); // Send HTTP reply to the client mg_printf(conn, "HTTP/1.1 200 OK\r\n" "Content-Type: text/plain\r\n" "Content-Length: %d\r\n" // Always set Content-Length "\r\n" "%s", content_length, content); // Returning non-zero tells civetweb that our function has replied to // the client, and civetweb should not send client any more data. return 1; } int http_server_start() { struct mg_context *ctx; struct mg_callbacks callbacks; // List of options. Last element must be NULL. const char *options[] = {"listening_ports", "8080", NULL}; // Prepare callbacks structure. We have only one callback, the rest are NULL. memset(&callbacks, 0, sizeof(callbacks)); callbacks.begin_request = begin_request_handler; // Start the web server. ctx = mg_start(&callbacks, NULL, options); // Wait until user hits "enter". Server is running in separate thread. // Navigating to http://localhost:8080 will invoke begin_request_handler(). getchar(); // Stop the server. mg_stop(ctx); return 0; }