From 020c53c8cc4a0f672909164d2d1974662747a892 Mon Sep 17 00:00:00 2001 From: MGadkari Date: Fri, 21 Aug 2015 16:15:36 +0530 Subject: [PATCH] Pass HTTP reject error code returned by server to client AG: added changelog and documentation comment Signed-off-by: Gadkari Mugdha Reviewed-by: Roger Meier HTTP reject error code returned by server during HTTP handshake is extracted and sent to the client application. With this fix, the Connection error callback will include the HTTP reject status code and response frame received from server. This string passed in Connection error callback can be read or ignored by client application based on client application requirement --- changelog | 8 ++++++++ lib/client.c | 18 ++++++++++++++---- lib/libwebsockets.h | 4 +++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/changelog b/changelog index b2f4a215..200e542a 100644 --- a/changelog +++ b/changelog @@ -1,6 +1,14 @@ Changelog --------- +(since last tag) + +User api changes +---------------- + +LWS_CALLBACK_CLIENT_CONNECTION_ERROR may provide an error string if in is +non-NULL. If so, the string has length len. + v1.4-chrome43-firefox36 ======================= diff --git a/lib/client.c b/lib/client.c index fd65ae8e..ebf64039 100644 --- a/lib/client.c +++ b/lib/client.c @@ -481,6 +481,7 @@ lws_client_interpret_server_handshake(struct libwebsocket_context *context, int okay = 0; char *p; int len; + int isErrorCodeReceived = 0; #ifndef LWS_NO_EXTENSIONS char ext_name[128]; struct libwebsocket_extension *ext; @@ -498,6 +499,8 @@ lws_client_interpret_server_handshake(struct libwebsocket_context *context, if (lws_hdr_total_length(wsi, WSI_TOKEN_ACCEPT) == 0) { lwsl_info("no ACCEPT\n"); + p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP); + isErrorCodeReceived = 1; goto bail3; } @@ -786,10 +789,17 @@ bail3: close_reason = LWS_CLOSE_STATUS_NOSTATUS; bail2: - if (wsi->protocol) - wsi->protocol->callback(context, wsi, - LWS_CALLBACK_CLIENT_CONNECTION_ERROR, - wsi->user_space, NULL, 0); + if (wsi->protocol) { + if (isErrorCodeReceived && p) { + wsi->protocol->callback(context, wsi, + LWS_CALLBACK_CLIENT_CONNECTION_ERROR, + wsi->user_space, p, (unsigned int)strlen(p)); + } else { + wsi->protocol->callback(context, wsi, + LWS_CALLBACK_CLIENT_CONNECTION_ERROR, + wsi->user_space, NULL, 0); + } + } lwsl_info("closing connection due to bail2 connection error\n"); diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index ccbcbf1b..7f4bea32 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -587,7 +587,9 @@ struct libwebsocket_extension; * an incoming client * * LWS_CALLBACK_CLIENT_CONNECTION_ERROR: the request client connection has - * been unable to complete a handshake with the remote server + * been unable to complete a handshake with the remote server. If + * in is non-NULL, you can find an error string of length len where + * it points to. * * LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH: this is the last chance for the * client user code to examine the http headers