If you are asking a question, please follow this template:
My goal is:
[Would like to keep http connection open and continue sending POST request]
My actions are:
Using the “Connection: keep-alive” in header during mg_connect_http() call, when MG_EV_HTTP_REPLY is received.
Call mg_print(buffer)
char buffer [] =
“POST / HTTP/1.1\r\n
HOST: 192.168.1.4:443\r\n
Content-Type: text/html\r\n
Connection: keep-alive\r\n”
Content-Length: 10\r\n\r\n
{Test_ing}\r\n"
The result I see is:
mg_connect_http() for initial POST request
events received :
MG_EV_CONNECT
MG_EV_SEND
MG_EV_HTTP_CHUNK
MG_EV_HTTP_REPLY
—> The connection does stay open in here
mg_print() for 2nd POST request
events received :
MG_EV_SEND
MG_EV_HTTP_CHUNK
MG_EV_HTTP_REPLY
MG_EV_CLOSE
The connection close right after “MG_EV_HTTP_REPLY” is received
Have confirmed in connecting test server, it received both POST request contents.
My expectation & question is:
I want the connection stay opened and can use mg_print to continue sending multiple POST request.
nliviu
October 29, 2021, 3:40pm
2
Here is a very simple example using a public test server. It builds and runs ok on ubuntu, esp8266 and esp32.
Example output:
[Oct 29 18:29:53.678] main.c:57 3.054 - connected OK (mg_connection 0x3ffc766c)
[Oct 29 18:29:53.791] main.c:64 3.167 - Reply: {"id":4,"token":"QpwL5tke4Pnpja7X4"}
[Oct 29 18:30:06.624] main.c:103 16.000 - Request (reusing connection): host: reqres.in, uri: /api/register, payload: {"email": "eve.holt@fife.com"}
[Oct 29 18:30:17.010] main.c:64 26.386 - Reply: {"error":"Missing password"}
[Oct 29 18:30:21.625] main.c:103 31.000 - Request (reusing connection): host: reqres.in, uri: /api/login, payload: {"email": "eve.holt@reqres.in"}
[Oct 29 18:30:21.735] main.c:64 31.111 - Reply: {"error":"Missing password"}
[Oct 29 18:30:36.624] main.c:103 46.000 - Request (reusing connection): host: reqres.in, uri: /api/login, payload: {"email": "eve.holt@reqres.in", "password": "123"}
[Oct 29 18:30:36.761] main.c:64 46.137 - Reply: {"token":"QpwL5tke4Pnpja7X4"}
[Oct 29 18:30:51.624] main.c:103 61.000 - Request (reusing connection): host: reqres.in, uri: /api/register, payload: {"email": "eve.holt@reqres.in", "password": "123"}
[Oct 29 18:30:52.163] main.c:64 61.538 - Reply: {"id":4,"token":"QpwL5tke4Pnpja7X4"}
[Oct 29 18:31:06.625] main.c:103 76.000 - Request (reusing connection): host: reqres.in, uri: /api/register, payload: {"email": "eve.holt@fife.com"}
[Oct 29 18:31:06.750] main.c:64 76.126 - Reply: {"error":"Missing password"}
If you don’t close the connection when processing MG_EV_HTTP_REPLY
, probably the server closes it.
My 2 cents: I see the POST specifies HTTP/1.1 and requests keep-alive, the server should honor that, check who is closing (and why) with a sniffer. If TLS gets in the middle do your testing in clear, though sometimes you can provide the keys to Wireshark (I don’t remember each case right now). I see you are using your internal network anyway.
Check your server’s timeout, Apache might close in 5s inactivity
Finally found the problem. There is a missing “/r/n” in the message sending to Server and it closed after receiving wrong format.