diff --git a/mongoose.c b/mongoose.c index d8d9b681dec93cdd0c009ece3648ef9d4109f9bf..2149dddf65b9125649f36ee25ec64206e98e6f87 100644 --- a/mongoose.c +++ b/mongoose.c @@ -190,6 +190,7 @@ struct ns_server { ns_callback_t callback; SSL_CTX *ssl_ctx; SSL_CTX *client_ssl_ctx; + const char *hexdump_file; sock_t ctl[2]; }; @@ -430,7 +431,36 @@ int ns_printf(struct ns_connection *conn, const char *fmt, ...) { return len; } +static void hexdump(struct ns_connection *nc, const char *path, + int num_bytes, enum ns_event ev) { + const struct iobuf *io = ev == NS_SEND ? &nc->send_iobuf : &nc->recv_iobuf; + FILE *fp; + char *buf, src[60], dst[60]; + int buf_size = num_bytes * 5 + 100; + + if ((fp = fopen(path, "a")) != NULL) { + ns_sock_to_str(nc->sock, src, sizeof(src), 3); + ns_sock_to_str(nc->sock, dst, sizeof(dst), 7); + fprintf(fp, "%lu %p %s %s %s %d\n", (unsigned long) time(NULL), + nc->connection_data, src, + ev == NS_RECV ? "<-" : ev == NS_SEND ? "->" : + ev == NS_ACCEPT ? "<A" : ev == NS_CONNECT ? "C>" : "XX", + dst, num_bytes); + if (num_bytes > 0 && (buf = (char *) malloc(buf_size)) != NULL) { + ns_hexdump(io->buf + (ev == NS_SEND ? 0 : io->len) - + (ev == NS_SEND ? 0 : num_bytes), num_bytes, buf, buf_size); + fprintf(fp, "%s", buf); + free(buf); + } + fclose(fp); + } +} + static void ns_call(struct ns_connection *conn, enum ns_event ev, void *p) { + if (conn->server->hexdump_file != NULL && ev != NS_POLL) { + int len = (ev == NS_RECV || ev == NS_SEND) ? * (int *) p : 0; + hexdump(conn, conn->server->hexdump_file, len, ev); + } if (conn->server->callback) conn->server->callback(conn, ev, p); } @@ -4793,6 +4823,8 @@ const char *mg_set_option(struct mg_server *server, const char *name, free(*v); *v = mg_strdup(buf); } + } else if (ind == HEXDUMP_FILE) { + server->ns_server.hexdump_file = *v; #ifndef _WIN32 } else if (ind == RUN_AS_USER) { struct passwd *pw; @@ -4857,37 +4889,8 @@ static void on_accept(struct ns_connection *nc, union socket_address *sa) { } } -#ifndef MONGOOSE_NO_FILESYSTEM -static void hexdump(struct ns_connection *nc, const char *path, - int num_bytes, int is_sent) { - const struct iobuf *io = is_sent ? &nc->send_iobuf : &nc->recv_iobuf; - FILE *fp; - char *buf, src[60], dst[60]; - int buf_size = num_bytes * 5 + 100; - - if (path != NULL && (fp = fopen(path, "a")) != NULL) { - ns_sock_to_str(nc->sock, src, sizeof(src), 3); - ns_sock_to_str(nc->sock, dst, sizeof(dst), 7); - fprintf(fp, "%lu %p %s %s %s %d\n", (unsigned long) time(NULL), - nc->connection_data, src, - is_sent == 0 ? "<-" : is_sent == 1 ? "->" : - is_sent == 2 ? "<A" : "C>", dst, num_bytes); - if (num_bytes > 0 && (buf = (char *) malloc(buf_size)) != NULL) { - ns_hexdump(io->buf + (is_sent ? 0 : io->len) - (is_sent ? 0 : num_bytes), - num_bytes, buf, buf_size); - fprintf(fp, "%s", buf); - free(buf); - } - fclose(fp); - } -} -#endif - static void mg_ev_handler(struct ns_connection *nc, enum ns_event ev, void *p) { struct connection *conn = (struct connection *) nc->connection_data; -#ifndef MONGOOSE_NO_FILESYSTEM - struct mg_server *server = (struct mg_server *) nc->server; -#endif // Send NS event to the handler. Note that call_user won't send an event // if conn == NULL. Therefore, repeat this for NS_ACCEPT event as well. @@ -4902,9 +4905,6 @@ static void mg_ev_handler(struct ns_connection *nc, enum ns_event ev, void *p) { switch (ev) { case NS_ACCEPT: on_accept(nc, (union socket_address *) p); -#ifndef MONGOOSE_NO_FILESYSTEM - hexdump(nc, server->config_options[HEXDUMP_FILE], 0, 2); -#endif #ifdef MONGOOSE_SEND_NS_EVENTS { struct connection *conn = (struct connection *) nc->connection_data; @@ -4919,9 +4919,6 @@ static void mg_ev_handler(struct ns_connection *nc, enum ns_event ev, void *p) { set_ips(nc, 1); set_ips(nc, 0); } -#ifndef MONGOOSE_NO_FILESYSTEM - hexdump(nc, server->config_options[HEXDUMP_FILE], 0, 3); -#endif conn->mg_conn.status_code = * (int *) p; if (conn->mg_conn.status_code != 0 || (!(nc->flags & MG_PROXY_CONN) && @@ -4931,9 +4928,6 @@ static void mg_ev_handler(struct ns_connection *nc, enum ns_event ev, void *p) { break; case NS_RECV: -#ifndef MONGOOSE_NO_FILESYSTEM - hexdump(nc, server->config_options[HEXDUMP_FILE], * (int *) p, 0); -#endif if (nc->flags & NSF_ACCEPTED) { on_recv_data(conn); #ifndef MONGOOSE_NO_CGI @@ -4950,9 +4944,6 @@ static void mg_ev_handler(struct ns_connection *nc, enum ns_event ev, void *p) { break; case NS_SEND: -#ifndef MONGOOSE_NO_FILESYSTEM - hexdump(nc, server->config_options[HEXDUMP_FILE], * (int *) p, 1); -#endif break; case NS_CLOSE: