From 6869b64b314328f78c867ea8c67d6257c2d58ea6 Mon Sep 17 00:00:00 2001 From: tayS Date: Fri, 21 Dec 2012 12:38:34 -0600 Subject: [PATCH 1/2] Fix for hang when sending large request with SSL enabled When using SSL, we must use SSL_pending() in addition to/instead of select() to determine whether there is SSL data to be read. This update makes the SSL_pending() function available and uses is to check for data if select() indicates there is no data. See https://github.com/valenok/mongoose/issues/47 --- mongoose.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mongoose.c b/mongoose.c index d341c76b..13e7ee60 100644 --- a/mongoose.c +++ b/mongoose.c @@ -306,6 +306,7 @@ extern int SSL_read(SSL *, void *, int); extern int SSL_write(SSL *, const void *, int); extern int SSL_get_error(const SSL *, int); extern int SSL_set_fd(SSL *, int); +extern int SSL_pending(SSL *); extern SSL *SSL_new(SSL_CTX *); extern SSL_CTX *SSL_CTX_new(SSL_METHOD *); extern SSL_METHOD *SSLv23_server_method(void); @@ -351,6 +352,7 @@ struct ssl_func { #define SSL_CTX_use_certificate_chain_file \ (* (int (*)(SSL_CTX *, const char *)) ssl_sw[16].ptr) #define SSLv23_client_method (* (SSL_METHOD * (*)(void)) ssl_sw[17].ptr) +#define SSL_pending (* (int (*)(SSL *)) ssl_sw[18].ptr) #define CRYPTO_num_locks (* (int (*)(void)) crypto_sw[0].ptr) #define CRYPTO_set_locking_callback \ @@ -383,6 +385,7 @@ static struct ssl_func ssl_sw[] = { {"SSL_load_error_strings", NULL}, {"SSL_CTX_use_certificate_chain_file", NULL}, {"SSLv23_client_method", NULL}, + {"SSL_pending", NULL}, {NULL, NULL} }; @@ -1469,6 +1472,9 @@ static int wait_until_socket_is_readable(struct mg_connection *conn) { FD_ZERO(&set); FD_SET(conn->client.sock, &set); result = select(conn->client.sock + 1, &set, NULL, NULL, &tv); + if(result == 0 && conn->ssl != NULL) { + result = SSL_pending(conn->ssl); + } } while ((result == 0 || (result < 0 && ERRNO == EINTR)) && conn->ctx->stop_flag == 0); From 94c7a3862a94818085a5d7c6dea02b0abc128293 Mon Sep 17 00:00:00 2001 From: Sergey Lyubka Date: Fri, 21 Dec 2012 21:47:14 +0000 Subject: [PATCH 2/2] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7d6e2eb4..539536d1 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Features - Crossplatform - works on Windows, MacOS and most flavors of UNIX - CGI, SSL, SSI, Digest (MD5) authorization, Websocket, WEbDAV support +- Lua server pages - Resumed download, URL rewrite support - IP-based ACL, Windows service, GET, POST, HEAD, PUT, DELETE methods - Excluding files from serving by URI pattern @@ -19,6 +20,7 @@ Features - Embeddable with simple and clean API ([mongoose.h](https://github.com/valenok/mongoose/blob/master/mongoose.h)). The source is in single [mongoose.c](https://github.com/valenok/mongoose/blob/master/mongoose.c) file to make things easy. - Embedding examples: [hello.c](https://github.com/valenok/mongoose/blob/master/examples/hello.c), [post.c](https://github.com/valenok/mongoose/blob/master/examples/post.c), [upload.c](https://github.com/valenok/mongoose/blob/master/examples/upload.c), [websocket.c](https://github.com/valenok/mongoose/blob/master/examples/websocket.c) - Python and C# bindings +- Super-liberal MIT license, great for commercial users! Mailing list