Project homepage Mailing List  Warmcat.com  API Docs  Github Mirror 
{"schema":"libjg2-1", "vpath":"/git/", "avatar":"/git/avatar/", "alang":"", "gen_ut":1711709429, "reponame":"libwebsockets", "desc":"libwebsockets lightweight C networking library", "owner": { "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" },"url":"https://libwebsockets.org/repo/libwebsockets", "f":3, "items": [ {"schema":"libjg2-1", "cid":"1e83a68c178f48e7690bf3a36b7b60d2", "commit": {"type":"commit", "time": 1526958850, "time_ofs": 480, "oid_tree": { "oid": "a5ad996ea5a33f595c12bf83bc16dd55d4ef14c3", "alias": []}, "oid":{ "oid": "95c0e8bf152d64792fb4f418bb4600a1752240a0", "alias": []}, "msg": "post-demo: defer even header writes to writable callback", "sig_commit": { "git_time": { "time": 1526958850, "offset": 480 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" }, "sig_author": { "git_time": { "time": 1526958850, "offset": 480 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" }}, "body": "post-demo: defer even header writes to writable callback" , "diff": "diff --git a/plugins/protocol_post_demo.c b/plugins/protocol_post_demo.c\nindex 5c76781..b774483 100644\n--- a/plugins/protocol_post_demo.c\n+++ b/plugins/protocol_post_demo.c\n@@ -37,13 +37,14 @@\n struct per_session_data__post_demo {\n \tstruct lws_spa *spa;\n \tchar result[LWS_PRE + 512];\n-\tint result_len;\n-\n \tchar filename[64];\n \tlong file_length;\n #if !defined(LWS_WITH_ESP32)\n \tlws_filefd_type fd;\n #endif\n+\tuint8_t completed:1;\n+\tuint8_t sent_headers:1;\n+\tuint8_t sent_body:1;\n };\n \n static const char * const param_names[] \u003d {\n@@ -111,13 +112,55 @@ file_upload_cb(void *data, const char *name, const char *filename,\n \treturn 0;\n }\n \n+/*\n+ * returns length in bytes\n+ */\n+\n+static int\n+format_result(struct per_session_data__post_demo *pss)\n+{\n+\tunsigned char *p, *start, *end;\n+\tint n;\n+\n+\tp \u003d (unsigned char *)pss-\u003eresult + LWS_PRE;\n+\tstart \u003d p;\n+\tend \u003d p + sizeof(pss-\u003eresult) - LWS_PRE - 1;\n+\n+\tp +\u003d sprintf((char *)p,\n+\t\t\u0022\u003chtml\u003e\u003cbody\u003e\u003ch1\u003eForm results (after urldecoding)\u003c/h1\u003e\u0022\n+\t\t\u0022\u003ctable\u003e\u003ctr\u003e\u003ctd\u003eName\u003c/td\u003e\u003ctd\u003eLength\u003c/td\u003e\u003ctd\u003eValue\u003c/td\u003e\u003c/tr\u003e\u0022);\n+\n+\tfor (n \u003d 0; n \u003c (int)ARRAY_SIZE(param_names); n++) {\n+\t\tif (!lws_spa_get_string(pss-\u003espa, n))\n+\t\t\tp +\u003d lws_snprintf((char *)p, end - p,\n+\t\t\t \u0022\u003ctr\u003e\u003ctd\u003e\u003cb\u003e%s\u003c/b\u003e\u003c/td\u003e\u003ctd\u003e0\u0022\n+\t\t\t \u0022\u003c/td\u003e\u003ctd\u003eNULL\u003c/td\u003e\u003c/tr\u003e\u0022,\n+\t\t\t param_names[n]);\n+\t\telse\n+\t\t\tp +\u003d lws_snprintf((char *)p, end - p,\n+\t\t\t \u0022\u003ctr\u003e\u003ctd\u003e\u003cb\u003e%s\u003c/b\u003e\u003c/td\u003e\u003ctd\u003e%d\u0022\n+\t\t\t \u0022\u003c/td\u003e\u003ctd\u003e%s\u003c/td\u003e\u003c/tr\u003e\u0022,\n+\t\t\t param_names[n],\n+\t\t\t lws_spa_get_length(pss-\u003espa, n),\n+\t\t\t lws_spa_get_string(pss-\u003espa, n));\n+\t}\n+\n+\tp +\u003d lws_snprintf((char *)p, end - p,\n+\t\t\t\u0022\u003c/table\u003e\u003cbr\u003e\u003cb\u003efilename:\u003c/b\u003e %s, \u0022\n+\t\t\t\u0022\u003cb\u003elength\u003c/b\u003e %ld\u0022,\n+\t\t\tpss-\u003efilename, pss-\u003efile_length);\n+\n+\tp +\u003d lws_snprintf((char *)p, end - p, \u0022\u003c/body\u003e\u003c/html\u003e\u0022);\n+\n+\treturn (int)lws_ptr_diff(p, start);\n+}\n+\n static int\n callback_post_demo(struct lws *wsi, enum lws_callback_reasons reason,\n \t\t void *user, void *in, size_t len)\n {\n \tstruct per_session_data__post_demo *pss \u003d\n \t\t\t(struct per_session_data__post_demo *)user;\n-\tunsigned char *buffer;\n \tunsigned char *p, *start, *end;\n \tint n;\n \n@@ -145,68 +188,61 @@ callback_post_demo(struct lws *wsi, enum lws_callback_reasons reason,\n \t\t/* call to inform no more payload data coming */\n \t\tlws_spa_finalize(pss-\u003espa);\n \n-\t\tp \u003d (unsigned char *)pss-\u003eresult + LWS_PRE;\n-\t\tend \u003d p + sizeof(pss-\u003eresult) - LWS_PRE - 1;\n-\t\tp +\u003d sprintf((char *)p,\n-\t\t\t\u0022\u003chtml\u003e\u003cbody\u003e\u003ch1\u003eForm results (after urldecoding)\u003c/h1\u003e\u0022\n-\t\t\t\u0022\u003ctable\u003e\u003ctr\u003e\u003ctd\u003eName\u003c/td\u003e\u003ctd\u003eLength\u003c/td\u003e\u003ctd\u003eValue\u003c/td\u003e\u003c/tr\u003e\u0022);\n-\n-\t\tfor (n \u003d 0; n \u003c (int)ARRAY_SIZE(param_names); n++) {\n-\t\t\tif (!lws_spa_get_string(pss-\u003espa, n))\n-\t\t\t\tp +\u003d lws_snprintf((char *)p, end - p,\n-\t\t\t\t \u0022\u003ctr\u003e\u003ctd\u003e\u003cb\u003e%s\u003c/b\u003e\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003eNULL\u003c/td\u003e\u003c/tr\u003e\u0022,\n-\t\t\t\t param_names[n]);\n-\t\t\telse\n-\t\t\t\tp +\u003d lws_snprintf((char *)p, end - p,\n-\t\t\t\t \u0022\u003ctr\u003e\u003ctd\u003e\u003cb\u003e%s\u003c/b\u003e\u003c/td\u003e\u003ctd\u003e%d\u003c/td\u003e\u003ctd\u003e%s\u003c/td\u003e\u003c/tr\u003e\u0022,\n-\t\t\t\t param_names[n],\n-\t\t\t\t lws_spa_get_length(pss-\u003espa, n),\n-\t\t\t\t lws_spa_get_string(pss-\u003espa, n));\n-\t\t}\n+\t\tpss-\u003ecompleted \u003d 1;\n+\t\tlws_callback_on_writable(wsi);\n+\t\tbreak;\n \n-\t\tp +\u003d lws_snprintf((char *)p, end - p, \u0022\u003c/table\u003e\u003cbr\u003e\u003cb\u003efilename:\u003c/b\u003e %s, \u003cb\u003elength\u003c/b\u003e %ld\u0022,\n-\t\t\t\tpss-\u003efilename, pss-\u003efile_length);\n+\tcase LWS_CALLBACK_HTTP_WRITEABLE:\n \n-\t\tp +\u003d lws_snprintf((char *)p, end - p, \u0022\u003c/body\u003e\u003c/html\u003e\u0022);\n-\t\tpss-\u003eresult_len \u003d lws_ptr_diff(p, pss-\u003eresult + LWS_PRE);\n+\t\tif (!pss-\u003ecompleted)\n+\t\t\tbreak;\n \n-\t\tn \u003d LWS_PRE + 1024;\n-\t\tbuffer \u003d malloc(n);\n-\t\tp \u003d buffer + LWS_PRE;\n+\t\tp \u003d (unsigned char *)pss-\u003eresult + LWS_PRE;\n \t\tstart \u003d p;\n-\t\tend \u003d p + n - LWS_PRE - 1;\n+\t\tend \u003d p + sizeof(pss-\u003eresult) - LWS_PRE - 1;\n \n-\t\tif (lws_add_http_header_status(wsi, HTTP_STATUS_OK, \u0026p, end))\n-\t\t\tgoto bail;\n+\t\tif (!pss-\u003esent_headers) {\n \n-\t\tif (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE,\n-\t\t\t\t(unsigned char *)\u0022text/html\u0022, 9, \u0026p, end))\n-\t\t\tgoto bail;\n-\t\tif (lws_add_http_header_content_length(wsi, pss-\u003eresult_len, \u0026p, end))\n-\t\t\tgoto bail;\n-\t\tif (lws_finalize_http_header(wsi, \u0026p, end))\n-\t\t\tgoto bail;\n+\t\t\tn \u003d format_result(pss);\n \n-\t\tn \u003d lws_write(wsi, start, p - start, LWS_WRITE_HTTP_HEADERS);\n-\t\tif (n \u003c 0)\n-\t\t\tgoto bail;\n-\t\tfree(buffer);\n+\t\t\tif (lws_add_http_header_status(wsi, HTTP_STATUS_OK,\n+\t\t\t\t\t\t \u0026p, end))\n+\t\t\t\tgoto bail;\n \n-\t\tlws_callback_on_writable(wsi);\n-\t\tbreak;\n+\t\t\tif (lws_add_http_header_by_token(wsi,\n+\t\t\t\t\tWSI_TOKEN_HTTP_CONTENT_TYPE,\n+\t\t\t\t\t(unsigned char *)\u0022text/html\u0022, 9,\n+\t\t\t\t\t\u0026p, end))\n+\t\t\t\tgoto bail;\n+\t\t\tif (lws_add_http_header_content_length(wsi, n, \u0026p, end))\n+\t\t\t\tgoto bail;\n+\t\t\tif (lws_finalize_http_header(wsi, \u0026p, end))\n+\t\t\t\tgoto bail;\n \n-\tcase LWS_CALLBACK_HTTP_WRITEABLE:\n-\t\tif (!pss-\u003eresult_len) {\n-\t\t\tlwsl_debug(\u0022nothing in result_len\u005cn\u0022);\n+\t\t\t/* first send the headers ... */\n+\t\t\tn \u003d lws_write(wsi, start, lws_ptr_diff(p, start),\n+\t\t\t\t LWS_WRITE_HTTP_HEADERS);\n+\t\t\tif (n \u003c 0)\n+\t\t\t\tgoto bail;\n+\n+\t\t\tpss-\u003esent_headers \u003d 1;\n+\t\t\tlws_callback_on_writable(wsi);\n \t\t\tbreak;\n \t\t}\n-\t\tlwsl_debug(\u0022LWS_CALLBACK_HTTP_WRITEABLE: sending %d\u005cn\u0022,\n-\t\t\t pss-\u003eresult_len);\n-\t\tn \u003d lws_write(wsi, (unsigned char *)pss-\u003eresult + LWS_PRE,\n-\t\t\t pss-\u003eresult_len, LWS_WRITE_HTTP_FINAL);\n-\t\tif (n \u003c 0)\n-\t\t\treturn 1;\n-\t\tgoto try_to_reuse;\n+\n+\t\tif (!pss-\u003esent_body) {\n+\n+\t\t\tn \u003d format_result(pss);\n+\n+\t\t\tn \u003d lws_write(wsi, (unsigned char *)start, n,\n+\t\t\t\t LWS_WRITE_HTTP_FINAL);\n+\n+\t\t\tpss-\u003esent_body \u003d 1;\n+\t\t\tif (n \u003c 0)\n+\t\t\t\treturn 1;\n+\t\t\tgoto try_to_reuse;\n+\t\t}\n+\t\tbreak;\n \n \tcase LWS_CALLBACK_HTTP_DROP_PROTOCOL:\n \t\t/* called when our wsi user_space is going to be destroyed */\n@@ -223,7 +259,6 @@ callback_post_demo(struct lws *wsi, enum lws_callback_reasons reason,\n \treturn 0;\n \n bail:\n-\tfree(buffer);\n \n \treturn 1;\n \n","s":{"c":1711709429,"u": 2712}} ],"g": 3672,"chitpc": 0,"ehitpc": 0,"indexed":0 , "ab": 0, "si": 0, "db":0, "di":0, "sat":0, "lfc": "0000"}