After migrating my home setup from nginx reverse proxying to relayd, i noticed my iOS devices having issues connecting through Websockets. After debugging, i noticed that relayd adds the "Connection: close" regardless of upgrade being requested.
This issue is also reported on a blog-post using relayd as a Websocket Client. https://deftly.net/posts/2019-10-23-websockets-with-relayd.html This resulted in the response having two Connection Headers, one "Connection: upgrade" and one "Connection: close", which iOS strict implementation does not allow. I have fixed the if condition that leads to this issue. The fix has been tested with Apple iOS 13 and the problem can be observed using Firefox and just connecting to something Websocket over relayd. Both "Connection:" headers will appear. best regards Franz diff --git usr.sbin/relayd/relay_http.c usr.sbin/relayd/relay_http.c index 960d4c54a..3a6678790 100644 --- usr.sbin/relayd/relay_http.c +++ usr.sbin/relayd/relay_http.c @@ -524,9 +524,11 @@ relay_read_http(struct bufferevent *bev, void *arg) /* * Ask the server to close the connection after this request - * since we don't read any further request headers. + * since we don't read any further request headers, unless + * an Upgrade is requested, in which case we do NOT want to add + * this header. */ - if (cre->toread == TOREAD_UNLIMITED) + if (cre->toread == TOREAD_UNLIMITED && upgrade == NULL) if (kv_add(&desc->http_headers, "Connection", "close", 0) == NULL) goto fail;
