diff --git a/mongoose.c b/mongoose.c index a24c89f227d41a3946c872e64168a9e8cce5ccaf..3db5e813455e563119d02ca896a6cd8c0f8af01f 100644 --- a/mongoose.c +++ b/mongoose.c @@ -2111,6 +2111,11 @@ static void mg_destroy_conn(struct mg_connection *conn, int destroy_if) { void mg_close_conn(struct mg_connection *conn) { DBG(("%p %lu %d", conn, conn->flags, conn->sock)); +#if MG_ENABLE_SSL + if (conn->flags & MG_F_SSL_HANDSHAKE_DONE) { + mg_ssl_if_conn_close_notify(conn); + } +#endif mg_remove_conn(conn); conn->iface->vtable->destroy_conn(conn); mg_call(conn, NULL, conn->user_data, MG_EV_CLOSE, NULL); @@ -4150,6 +4155,12 @@ int mg_ssl_if_write(struct mg_connection *nc, const void *data, size_t len) { return n; } +void mg_ssl_if_conn_close_notify(struct mg_connection *nc) { + struct mg_ssl_if_ctx *ctx = (struct mg_ssl_if_ctx *) nc->ssl_if_data; + if (ctx == NULL) return; + SSL_shutdown(ctx->ssl); +} + void mg_ssl_if_conn_free(struct mg_connection *nc) { struct mg_ssl_if_ctx *ctx = (struct mg_ssl_if_ctx *) nc->ssl_if_data; if (ctx == NULL) return; @@ -4637,6 +4648,12 @@ int mg_ssl_if_write(struct mg_connection *nc, const void *data, size_t len) { return n; } +void mg_ssl_if_conn_close_notify(struct mg_connection *nc) { + struct mg_ssl_if_ctx *ctx = (struct mg_ssl_if_ctx *) nc->ssl_if_data; + if (ctx == NULL) return; + mbedtls_ssl_close_notify(ctx->ssl); +} + void mg_ssl_if_conn_free(struct mg_connection *nc) { struct mg_ssl_if_ctx *ctx = (struct mg_ssl_if_ctx *) nc->ssl_if_data; if (ctx == NULL) return; @@ -13638,6 +13655,11 @@ enum mg_ssl_if_result mg_ssl_if_conn_init( return MG_SSL_OK; } +void mg_ssl_if_conn_close_notify(struct mg_connection *nc) { + /* Nothing to do */ + (void) nc; +} + void mg_ssl_if_conn_free(struct mg_connection *nc) { struct mg_ssl_if_ctx *ctx = (struct mg_ssl_if_ctx *) nc->ssl_if_data; if (ctx == NULL) return; diff --git a/mongoose.h b/mongoose.h index bc8c8c21eccca429a96a400f2b033f0c896ff2a5..5109171dfc6efafdd6aed7667490ae51727ed2dc 100644 --- a/mongoose.h +++ b/mongoose.h @@ -3153,6 +3153,7 @@ enum mg_ssl_if_result mg_ssl_if_conn_init( const char **err_msg); enum mg_ssl_if_result mg_ssl_if_conn_accept(struct mg_connection *nc, struct mg_connection *lc); +void mg_ssl_if_conn_close_notify(struct mg_connection *nc); void mg_ssl_if_conn_free(struct mg_connection *nc); enum mg_ssl_if_result mg_ssl_if_handshake(struct mg_connection *nc);