<div dir="ltr"><div dir="ltr"><div dir="ltr">Andy,<div>I just tested the patch, it is fully working, you fixed it, great job</div><div><br></div><div>One very small note, you have a typo in a log message, <font face="monospace, monospace">lib/roles/ws/client-ws.c</font>, line 310</div><div><font face="monospace, monospace">lwsl_info("%s: malfored connection '%s'\n",</font><br></div><div>a <b>m</b> is missing</div><div><br></div><div>Thank you</div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, May 4, 2019 at 12:39 AM Andy Green <<a href="mailto:andy@warmcat.com">andy@warmcat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
<br>
On 03/05/2019 22:18, Paolo Denti wrote:<br>
> Andy<br>
> this is the not working full header parsing (I just changed host name in <br>
> the log)<br>
> <br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'C' 0x43 (role=0x10000000) wsi->lextable_pos=0<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'o' 0x6F (role=0x10000000) wsi->lextable_pos=117<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'n' 0x6E (role=0x10000000) wsi->lextable_pos=124<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'n' 0x6E (role=0x10000000) wsi->lextable_pos=131<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'e' 0x65 (role=0x10000000) wsi->lextable_pos=138<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'c' 0x63 (role=0x10000000) wsi->lextable_pos=139<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 't' 0x74 (role=0x10000000) wsi->lextable_pos=140<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'i' 0x69 (role=0x10000000) wsi->lextable_pos=141<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'o' 0x6F (role=0x10000000) wsi->lextable_pos=148<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'n' 0x6E (role=0x10000000) wsi->lextable_pos=149<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART ':' 0x3A (role=0x10000000) wsi->lextable_pos=150<br>
> PARSER: known hdr 4<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) ' '<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 'u'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 'p'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 'g'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 'r'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 'a'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 'd'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 'e'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) '<br>
> '<br>
> PARSER: *<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_SKIPPING_SAW_CR '<br>
> <br>
<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'C' 0x43 (role=0x10000000) wsi->lextable_pos=0<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'o' 0x6F (role=0x10000000) wsi->lextable_pos=117<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'n' 0x6E (role=0x10000000) wsi->lextable_pos=124<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'n' 0x6E (role=0x10000000) wsi->lextable_pos=131<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'e' 0x65 (role=0x10000000) wsi->lextable_pos=138<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'c' 0x63 (role=0x10000000) wsi->lextable_pos=139<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 't' 0x74 (role=0x10000000) wsi->lextable_pos=140<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'i' 0x69 (role=0x10000000) wsi->lextable_pos=141<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'o' 0x6F (role=0x10000000) wsi->lextable_pos=148<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART 'n' 0x6E (role=0x10000000) wsi->lextable_pos=149<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART ':' 0x3A (role=0x10000000) wsi->lextable_pos=150<br>
> PARSER: known hdr 4<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) ' '<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 'c'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 'l'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 'o'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 's'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) 'e'<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOK_(4) '<br>
> '<br>
> PARSER: *<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_SKIPPING_SAW_CR '<br>
> <br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART '<br>
> ' 0x0D (role=0x10000000) wsi->lextable_pos=0<br>
> DEBUG: 0x559119c38a30: SSL_read says 1<br>
> PARSER: WSI_TOKEN_NAME_PART '<br>
> i->lextable_pos=238<br>
> PARSER: known hdr 8<br>
> PARSER: v00 hdrs done<br>
> ERR: CLIENT_CONNECTION_ERROR: HS: UPGRADE malformed<br>
> INFO: closing connection (prot dumb-increment-protocol) due to bail2 <br>
> connection error: HS: UPGRADE malformed<br>
> INFO: __lws_close_free_wsi: 0x559119c38a30: caller: c hs interp<br>
<br>
Thanks.  From the log, what's happening is the server is sending two <br>
Connection: headers... one says "upgrade" and the other says "close".<br>
<br>
I reproduced it with this on the minimal examples<br>
<br>
diff --git <br>
a/minimal-examples/ws-client/minimal-ws-client-rx/minimal-ws-client.c <br>
b/minimal-examples/ws-client/minimal-ws-client-rx/minimal-ws-client.c<br>
index 849eab68c..8254680b1 100644<br>
--- a/minimal-examples/ws-client/minimal-ws-client-rx/minimal-ws-client.c<br>
+++ b/minimal-examples/ws-client/minimal-ws-client-rx/minimal-ws-client.c<br>
@@ -124,6 +124,11 @@ int main(int argc, const char **argv)<br>
         i.protocol = protocols[0].name; /* "dumb-increment-protocol" */<br>
         i.pwsi = &client_wsi;<br>
<br>
+       i.protocol = "lws-minimal";<br>
+       i.address = "127.0.0.1";<br>
+       i.port = 7681;<br>
+       i.ssl_connection = 0;<br>
+<br>
         if (lws_cmdline_option(argc, argv, "--h2"))<br>
                 i.alpn = "h2";<br>
<br>
diff --git <br>
a/minimal-examples/ws-server/minimal-ws-server/protocol_lws_minimal.c <br>
b/minimal-examples/ws-server/minimal-ws-server/protocol_lws_minimal.c<br>
index 3c8160b1c..228fddae7 100644<br>
--- a/minimal-examples/ws-server/minimal-ws-server/protocol_lws_minimal.c<br>
+++ b/minimal-examples/ws-server/minimal-ws-server/protocol_lws_minimal.c<br>
@@ -69,6 +69,7 @@ callback_minimal(struct lws *wsi, enum <br>
lws_callback_reasons reason,<br>
                         (struct per_vhost_data__minimal *)<br>
                         lws_protocol_vh_priv_get(lws_get_vhost(wsi),<br>
                                         lws_get_protocol(wsi));<br>
+       struct lws_process_html_args *args;<br>
         int m;<br>
<br>
         switch (reason) {<br>
@@ -81,6 +82,17 @@ callback_minimal(struct lws *wsi, enum <br>
lws_callback_reasons reason,<br>
                 vhd->vhost = lws_get_vhost(wsi);<br>
                 break;<br>
<br>
+       case LWS_CALLBACK_ADD_HEADERS:<br>
+               args = (struct lws_process_html_args *)in;<br>
+<br>
+               if (lws_add_http_header_by_name(wsi,<br>
+                       (unsigned char *)"connection:",<br>
+                       (unsigned char *)"close", 5,<br>
+                       (unsigned char **)&args->p,<br>
+                       (unsigned char *)args->p + args->max_len))<br>
+                               return 1;<br>
+               break;<br>
+<br>
         case LWS_CALLBACK_ESTABLISHED:<br>
<br>
<br>
lws does what it should do in terms of header coalescing, it produces <br>
the overall connection header 'Upgrade,  close'.<br>
<br>
But the code in lws that specifically checks the tokens in the <br>
connection string doesn't restrict its check for "upgrade" to just the 7 <br>
characters of the first token, it checks against the whole "Upgrade, <br>
close" string.  There are very very few servers that produce anything <br>
except "upgrade" (that's what is shown in RFC6455, and the mixing of old <br>
and new connection tokens is not discussed there), so this bug <br>
introduced in v3.1 didn't have any chance to make a problem until now.<br>
<br>
I pushed a patch on v3.1-stable and master to correct it... I'm pretty <br>
sure upgrading to that will solve it for you.<br>
<br>
-Andy<br>
</blockquote></div>