From e488bce09ba9655e7073f5d0dfdd808dc732da79 Mon Sep 17 00:00:00 2001
From: Andy Green <andy@warmcat.com>
Date: Thu, 21 Mar 2019 06:51:35 +0800
Subject: [PATCH] nossl recv: always respond to 0 length read as shutdown

---
 lib/core/output.c                                         | 8 ++++++++
 .../http-client/minimal-http-client/minimal-http-client.c | 6 +++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/lib/core/output.c b/lib/core/output.c
index 49d289db..a347462e 100644
--- a/lib/core/output.c
+++ b/lib/core/output.c
@@ -244,6 +244,7 @@ lws_ssl_capable_read_no_ssl(struct lws *wsi, unsigned char *buf, int len)
 
 	lws_stats_atomic_bump(context, pt, LWSSTATS_C_API_READ, 1);
 
+	errno = 0;
 	if (lws_wsi_is_udp(wsi)) {
 #if !defined(LWS_WITH_ESP32)
 		wsi->udp->salen = sizeof(wsi->udp->sa);
@@ -258,6 +259,13 @@ lws_ssl_capable_read_no_ssl(struct lws *wsi, unsigned char *buf, int len)
 		if (!n && wsi->unix_skt)
 			return LWS_SSL_CAPABLE_ERROR;
 
+		/*
+		 * See https://libwebsockets.org/
+		 * pipermail/libwebsockets/2019-March/007857.html
+		 */
+		if (!n)
+			return LWS_SSL_CAPABLE_ERROR;
+
 		if (wsi->vhost)
 			wsi->vhost->conn_stats.rx += n;
 		lws_stats_atomic_bump(context, pt, LWSSTATS_B_READ, n);
diff --git a/minimal-examples/http-client/minimal-http-client/minimal-http-client.c b/minimal-examples/http-client/minimal-http-client/minimal-http-client.c
index 4382647b..d8ce2421 100644
--- a/minimal-examples/http-client/minimal-http-client/minimal-http-client.c
+++ b/minimal-examples/http-client/minimal-http-client/minimal-http-client.c
@@ -146,7 +146,8 @@ int main(int argc, const char **argv)
 
 	memset(&i, 0, sizeof i); /* otherwise uninitialized garbage */
 	i.context = context;
-	i.ssl_connection = LCCSCF_USE_SSL;
+	if (!lws_cmdline_option(argc, argv, "-n"))
+		i.ssl_connection = LCCSCF_USE_SSL;
 
 	if (lws_cmdline_option(argc, argv, "-l")) {
 		i.port = 7681;
@@ -160,6 +161,9 @@ int main(int argc, const char **argv)
 	if (lws_cmdline_option(argc, argv, "--h1"))
 		i.alpn = "http/1.1";
 
+	if ((p = lws_cmdline_option(argc, argv, "-p")))
+		i.port = atoi(p);
+
 	i.path = "/";
 	i.host = i.address;
 	i.origin = i.address;
-- 
GitLab