static void set_option(char **options, const char *name, const char *value) { int i; if (!strcmp(name, "document_root") || !(strcmp(name, "r"))) { verify_document_root(value); } for (i = 0; i < MAX_OPTIONS - 3; i++) { if (options[i] == NULL) { options[i] = sdup(name); options[i + 1] = sdup(value); options[i + 2] = NULL; break; } } if (i == MAX_OPTIONS - 3) { die("%s", "Too many options specified"); } }
static void *mongoose_callback(enum mg_event event, struct mg_connection *conn) { const struct mg_request_info *request_info = mg_get_request_info(conn); if (event == MG_INIT0) { verify_document_root(mg_get_conn_option(conn, "document_root")); return (void *)1; } #if defined(_WIN32) if (event == MG_EVENT_LOG && strstr(request_info->log_message, "cannot bind to") && !strcmp(request_info->log_severity, "error")) { if (!error_dialog_shown_previously) { MessageBoxA(NULL, request_info->log_message, "Error", MB_OK); error_dialog_shown_previously = 1; } return 0; } #endif if (event != MG_NEW_REQUEST) { // This callback currently only handles new requests return NULL; } { int file_found; struct mgstat fst; assert(request_info->phys_path); file_found = (0 == mg_stat(request_info->phys_path, &fst) && !fst.is_directory); if (file_found) { return NULL; // let mongoose handle the default of 'file exists'... } #ifdef _WIN32 // Send the systray icon as favicon if (!strcmp("/favicon.ico", request_info->uri)) { HMODULE module; HRSRC icon; DWORD len; void *data; module = GetModuleHandle(NULL); icon = FindResource(module, MAKEINTRESOURCE(IDR_FAVICON), RT_RCDATA); data = LockResource(LoadResource(module, icon)); len = SizeofResource(module, icon); mg_add_response_header(conn, 0, "Content-Type", "image/x-icon"); mg_add_response_header(conn, 0, "Cache-Control", "no-cache"); mg_add_response_header(conn, 0, "Content-Length", "%u", (unsigned int)len); //mg_add_response_header(conn, 0, "Connection", suggest_connection_header(conn)); -- not needed any longer mg_write_http_response_head(conn, 200, NULL); if ((int)len != mg_write(conn, data, len)) { mg_send_http_error(conn, 580, NULL, "not all data was written to the socket (len: %u)", (unsigned int)len); // internal error in our custom handler or client closed connection prematurely } return (void *)1; } #endif } return NULL; }
static void *mongoose_callback(enum mg_event event, struct mg_connection *conn) { const struct mg_request_info *request_info = mg_get_request_info(conn); if (event == MG_INIT0) { verify_document_root(mg_get_conn_option(conn, "document_root")); return (void *)1; } #if defined(_WIN32) if (event == MG_EVENT_LOG && strstr(request_info->log_message, "cannot bind to") && !strcmp(request_info->log_severity, "error")) { if (!error_dialog_shown_previously) { MessageBoxA(NULL, request_info->log_message, "Error", MB_OK); error_dialog_shown_previously = 1; } return 0; } #endif #if USE_BEL2125_TEST_NR_18_EVENT_HANDLER { int contentLength = 0; int dataRead = 0; char postData[BUFFER_SIZE] = { 0 }; const char* contentType = NULL; if (event == MG_NEW_REQUEST) { if (strstr(request_info->uri, "/echo") == request_info->uri) { int ie_hack = 0; // testing an assumption; turns out it doesn't matter whether headers make it into TCP stack before you expect to fetch all input data at once. int ie_hack2 = 0; contentLength = atoi(mg_get_header(conn, "Content-Length")); assert(contentLength <= BUFFER_SIZE); mg_set_response_code(conn, 200); if (ie_hack2) mg_connection_must_close(conn); // the stackoverflow suggested fix: http://stackoverflow.com/questions/3731420/why-does-ie-issue-random-xhr-408-12152-responses-using-jquery-post contentType = mg_get_header(conn, "Content-Type"); if (ie_hack) { //mg_add_response_header(conn, 0, "Connection", mg_suggest_connection_header(conn)); -- not needed any longer mg_add_response_header(conn, 0, "Content-Type", contentType); mg_add_response_header(conn, 0, "Content-Length", "%d", contentLength); mg_write_http_response_head(conn, 0, 0); // let the previous mg_set_response_code() decide for us } dataRead = mg_read(conn, postData, contentLength); if (dataRead > 0) { assert(dataRead == contentLength); if (!ie_hack) { //mg_add_response_header(conn, 0, "Connection", mg_suggest_connection_header(conn)); -- not needed any longer mg_add_response_header(conn, 0, "Content-Type", contentType); mg_add_response_header(conn, 0, "Content-Length", "%d", dataRead); mg_write_http_response_head(conn, 0, 0); // let the previous mg_set_response_code() decide for us } if (mg_write(conn, postData, dataRead) != contentLength) { mg_send_http_error(conn, 580, NULL, "not all data was written to the socket (len: %u)", (unsigned int)contentLength); // internal error in our custom handler or client closed connection prematurely } return (void*)1; } else { mg_send_http_error(conn, 500, NULL, "I/O failure during mg_read() from connection: %s", mg_strerror(ERRNO)); } } } } #endif // USE_BEL2125_TEST_NR_18_EVENT_HANDLER if (event != MG_NEW_REQUEST) { // This callback currently only handles new requests return NULL; } { int file_found; struct mgstat fst; assert(request_info->phys_path); file_found = (0 == mg_stat(request_info->phys_path, &fst) && !fst.is_directory); if (file_found) { return NULL; // let mongoose handle the default of 'file exists'... } #ifdef _WIN32 // Send the systray icon as favicon if (!strcmp("/favicon.ico", request_info->uri)) { HMODULE module; HRSRC icon; DWORD len; void *data; module = GetModuleHandle(NULL); icon = FindResource(module, MAKEINTRESOURCE(IDR_FAVICON), RT_RCDATA); data = LockResource(LoadResource(module, icon)); len = SizeofResource(module, icon); mg_add_response_header(conn, 0, "Content-Type", "image/x-icon"); mg_add_response_header(conn, 0, "Cache-Control", "no-cache"); mg_add_response_header(conn, 0, "Content-Length", "%u", (unsigned int)len); //mg_add_response_header(conn, 0, "Connection", suggest_connection_header(conn)); -- not needed any longer mg_write_http_response_head(conn, 200, NULL); if ((int)len != mg_write(conn, data, len)) { mg_send_http_error(conn, 580, NULL, "not all data was written to the socket (len: %u)", (unsigned int)len); // internal error in our custom handler or client closed connection prematurely } return (void *)1; } #endif } return NULL; }