Skip to content
Snippets Groups Projects
Commit 14764ccb authored by Andy Green's avatar Andy Green
Browse files

ws client: apply tokenize to upgrade header

Switches to use lws_hdr_copy() for the case the header is fragmented

See also https://github.com/warmcat/libwebsockets/issues/1435
parent a5b2248e
Branches
Tags
No related merge requests found
...@@ -204,10 +204,12 @@ lws_generate_client_ws_handshake(struct lws *wsi, char *p, const char *conn1) ...@@ -204,10 +204,12 @@ lws_generate_client_ws_handshake(struct lws *wsi, char *p, const char *conn1)
int int
lws_client_ws_upgrade(struct lws *wsi, const char **cce) lws_client_ws_upgrade(struct lws *wsi, const char **cce)
{ {
int n, len, okay = 0;
struct lws_context *context = wsi->context; struct lws_context *context = wsi->context;
struct lws_tokenize ts;
int n, len, okay = 0;
lws_tokenize_elem e;
char *p, buf[64];
const char *pc; const char *pc;
char *p;
#if !defined(LWS_WITHOUT_EXTENSIONS) #if !defined(LWS_WITHOUT_EXTENSIONS)
struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi]; struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
char *sb = (char *)&pt->serv_buf[0]; char *sb = (char *)&pt->serv_buf[0];
...@@ -262,18 +264,31 @@ lws_client_ws_upgrade(struct lws *wsi, const char **cce) ...@@ -262,18 +264,31 @@ lws_client_ws_upgrade(struct lws *wsi, const char **cce)
goto bail3; goto bail3;
} }
p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_CONNECTION); /* connection: must have "upgrade" */
if (!p) {
lwsl_info("no Connection hdr\n"); lws_tokenize_init(&ts, buf, LWS_TOKENIZE_F_COMMA_SEP_LIST |
*cce = "HS: CONNECTION missing"; LWS_TOKENIZE_F_MINUS_NONTERM);
goto bail3; ts.len = lws_hdr_copy(wsi, buf, sizeof(buf) - 1, WSI_TOKEN_CONNECTION);
} if (ts.len <= 0) /* won't fit, or absent */
strtolower(p); goto bad_conn_format;
if (strcmp(p, "upgrade")) {
lwsl_warn("lws_client_int_s_hs: bad header %s\n", p); do {
*cce = "HS: UPGRADE malformed"; e = lws_tokenize(&ts);
goto bail3; switch (e) {
} case LWS_TOKZE_TOKEN:
if (!strcasecmp(ts.token, "upgrade"))
e = LWS_TOKZE_ENDED;
break;
case LWS_TOKZE_DELIMITER:
break;
default: /* includes ENDED */
bad_conn_format:
*cce = "HS: UPGRADE malformed";
goto bail3;
}
} while (e > 0);
pc = lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS); pc = lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS);
if (!pc) { if (!pc) {
......
...@@ -304,10 +304,9 @@ lws_process_ws_upgrade(struct lws *wsi) ...@@ -304,10 +304,9 @@ lws_process_ws_upgrade(struct lws *wsi)
break; break;
case LWS_TOKZE_DELIMITER: case LWS_TOKZE_DELIMITER:
case LWS_TOKZE_ENDED:
break; break;
default: default: /* includes ENDED */
bad_conn_format: bad_conn_format:
lwsl_err("%s: malformed or absent connection hdr\n", lwsl_err("%s: malformed or absent connection hdr\n",
__func__); __func__);
...@@ -334,7 +333,8 @@ check_protocol: ...@@ -334,7 +333,8 @@ check_protocol:
*/ */
lws_tokenize_init(&ts, buf, LWS_TOKENIZE_F_COMMA_SEP_LIST | lws_tokenize_init(&ts, buf, LWS_TOKENIZE_F_COMMA_SEP_LIST |
LWS_TOKENIZE_F_MINUS_NONTERM); LWS_TOKENIZE_F_MINUS_NONTERM |
LWS_TOKENIZE_F_RFC7230_DELIMS);
ts.len = lws_hdr_copy(wsi, buf, sizeof(buf) - 1, WSI_TOKEN_PROTOCOL); ts.len = lws_hdr_copy(wsi, buf, sizeof(buf) - 1, WSI_TOKEN_PROTOCOL);
if (ts.len < 0) { if (ts.len < 0) {
lwsl_err("%s: protocol list too long\n", __func__); lwsl_err("%s: protocol list too long\n", __func__);
......
...@@ -259,7 +259,7 @@ bail: ...@@ -259,7 +259,7 @@ bail:
static int static int
remote_method_call(struct lws_dbus_ctx_wsproxy_client *dcwc) remote_method_call(struct lws_dbus_ctx_wsproxy_client *dcwc)
{ {
const char *uri = "wss://libwebsockets.org/"; const char *uri = "wss://libwebsockets.org/?mirror=dbt";
const char *subprotocol = "lws-mirror-protocol"; const char *subprotocol = "lws-mirror-protocol";
DBusMessage *msg; DBusMessage *msg;
int ret = 1; int ret = 1;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment