X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-ws-client.c;h=f00707c341f608342dca86ab0f3476bb1aa6fc27;hb=9b1f8506d92d34fc51763561421b393aaf040d90;hp=2569d1350fba05f0b64ea914aaccc49fe42872be;hpb=c7e9786d408f13d8f8f43c6b68da916bbb1ed5f3;p=src%2Fapp-framework-binder.git diff --git a/src/afb-ws-client.c b/src/afb-ws-client.c index 2569d135..f00707c3 100644 --- a/src/afb-ws-client.c +++ b/src/afb-ws-client.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "afb-wsj1.h" @@ -50,14 +51,6 @@ static const char *compkeys[32] = { "MHiEc+Qc8w/SJ3zMHEM8pA==", "FVCxLBmoil3gY0jSX3aNJ6kR/t4=" }; -static const char websocket_s[] = "websocket"; -static const char sec_websocket_key_s[] = "Sec-WebSocket-Key"; -static const char sec_websocket_version_s[] = "Sec-WebSocket-Version"; -static const char sec_websocket_accept_s[] = "Sec-WebSocket-Accept"; -static const char sec_websocket_protocol_s[] = "Sec-WebSocket-Protocol"; - -static const char vseparators[] = " \t,"; - /* get randomly a pair of key/accept value */ static void getkeypair(const char **key, const char **ack) { @@ -110,7 +103,7 @@ static char *strjoin(int count, const char **strings, const char *separ) /* creates the http message for the request */ static int make_request(char **request, const char *path, const char *host, const char *key, const char *protocols) { - int rc = asprintf(request, + int rc = asprintf(request, "GET %s HTTP/1.1\r\n" "Host: %s\r\n" "Upgrade: websocket\r\n" @@ -200,15 +193,15 @@ static int receive_response(int fd, const char **protocols, const char *ack) goto error; len = strcspn(line, " "); if (len != 8 || 0 != strncmp(line, "HTTP/1.1", 8)) - goto error; + goto abort; it = line + len; len = strspn(it, " "); if (len == 0) - goto error; + goto abort; it += len; len = strcspn(it, " "); if (len != 3 || 0 != strncmp(it, "101", 3)) - goto error; + goto abort; /* reads the rest of the response until empty line */ clen = 0; @@ -249,15 +242,13 @@ static int receive_response(int fd, const char **protocols, const char *ack) if (clen > 0) { while (read(fd, line, len) < 0 && errno == EINTR); } - if (haserr != 0) - result = -1; - else if (result < 0) { - result = 0; - while(protocols[result] != NULL) - result++; - } -error: + if (haserr != 0 || result < 0) + goto abort; return result; +abort: + errno = ECONNABORTED; +error: + return -1; } static int negociate(int fd, const char **protocols, const char *path, const char *host) @@ -315,7 +306,6 @@ invalid: errno = EINVAL; error: return -1; - } @@ -323,7 +313,7 @@ error: static const char *proto_json1[2] = { "x-afb-ws-json1", NULL }; -struct afb_wsj1 *afb_ws_client_connect_wsj1(const char *uri, struct afb_wsj1_itf *itf, void *closure) +struct afb_wsj1 *afb_ws_client_connect_wsj1(struct sd_event *eloop, const char *uri, struct afb_wsj1_itf *itf, void *closure) { int rc, fd; char *host, *service, xhost[32]; @@ -364,9 +354,11 @@ struct afb_wsj1 *afb_ws_client_connect_wsj1(const char *uri, struct afb_wsj1_itf if (rc == 0) { rc = negociate(fd, proto_json1, path, xhost); if (rc == 0) { - result = afb_wsj1_create(fd, itf, closure); - if (result != NULL) + result = afb_wsj1_create(eloop, fd, itf, closure); + if (result != NULL) { + fcntl(fd, F_SETFL, O_NONBLOCK); break; + } } } close(fd);