From: Andy Green Date: Thu, 29 Jun 2017 03:26:22 +0000 (+0800) Subject: lws_return_http_status: if not in HTTP/2, restrict to a single write X-Git-Tag: accepted/tizen/4.0/unified/20171012.191640~58 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Flibwebsockets.git;a=commitdiff_plain;h=6a89c7e9317cd13a20d3d45b4bf392c2196a61f0 lws_return_http_status: if not in HTTP/2, restrict to a single write --- diff --git a/lib/header.c b/lib/header.c index 92be738..8dd0d5f 100644 --- a/lib/header.c +++ b/lib/header.c @@ -222,17 +222,14 @@ lws_return_http_status(struct lws *wsi, unsigned int code, struct lws_context *context = lws_get_context(wsi); struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi]; unsigned char *p = pt->serv_buf + LWS_PRE; - unsigned char *start = p, *body = p + 512; + unsigned char *start = p; unsigned char *end = p + context->pt_serv_buf_size - LWS_PRE; - int n, m, len; + int n = 0, m, len; char slen[20]; if (!html_body) html_body = ""; - len = sprintf((char *)body, "

%u

%s", - code, html_body); - if (lws_add_http_header_status(wsi, code, &p, end)) return 1; @@ -240,7 +237,10 @@ lws_return_http_status(struct lws *wsi, unsigned int code, (unsigned char *)"text/html", 9, &p, end)) return 1; + + len = 37 + strlen(html_body) + sprintf(slen, "%d", code); n = sprintf(slen, "%d", len); + if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_CONTENT_LENGTH, (unsigned char *)slen, n, &p, end)) @@ -249,11 +249,30 @@ lws_return_http_status(struct lws *wsi, unsigned int code, if (lws_finalize_http_header(wsi, &p, end)) return 1; - m = lws_write(wsi, start, p - start, LWS_WRITE_HTTP_HEADERS); - if (m != (int)(p - start)) - return 1; +#if defined(LWS_USE_HTTP2) + { + unsigned char *body = p + 512; + + m = lws_write(wsi, start, p - start, LWS_WRITE_HTTP_HEADERS); + if (m != (int)(p - start)) + return 1; - m = lws_write(wsi, body, len, LWS_WRITE_HTTP); + len = sprintf((char *)body, "

%u

%s", + code, html_body); + + n = len; + m = lws_write(wsi, body, len, LWS_WRITE_HTTP); + } +#else + p += lws_snprintf((char *)p, end - p - 1, + "

%u

%s", + code, html_body); + + n = (int)(p - start); + m = lws_write(wsi, start, n, LWS_WRITE_HTTP); + if (m != n) + return 1; +#endif return m != n; } diff --git a/test-server/test-server-http.c b/test-server/test-server-http.c index a990f6f..070bf7e 100644 --- a/test-server/test-server-http.c +++ b/test-server/test-server-http.c @@ -378,7 +378,7 @@ int callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, if (!mimetype) { lwsl_err("Unknown mimetype for %s\n", buf); lws_return_http_status(wsi, - HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE, NULL); + HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE, "Unknown Mimetype"); return -1; }