ESP8266 NodeMCU Lua: http.post() 总是包含 "Connection: close" header
ESP8266 NodeMCU Lua: http.post() includes always "Connection: close" header
我正在编写一个 lua 脚本,用于将一些数据发送到我使用 spring-boot 从我的 ESP8266 WeMOS LoLin 开发板开发的网络应用程序。为此,脚本必须首先在 webapp 上进行身份验证。问题是当我 POST 身份验证数据时,我在服务器日志中发现即使身份验证正确完成,session 也关闭了。
这是我的部分 lua 代码
print("Authenticating .........")
local url = getBaseUrl() .. '/login'
local body = 'username=' .. config.server.usr .. '&'..
'password=' .. config.server.pwd .. '&' ..
'X-CSRF-TOKEN=a65sd464-6666-4bb4-4543-23k234tl234'
local headers =
'Content-Type: application/x-www-form-urlencoded\r\n'..
'Connection: keep-alive\r\n'..
'Accept: */*\r\n' ..
'Cookie: JSESSIONID=F7A9D7FA7D9AF79D7F9ASD7FA97A979F7D7A'
print(url, "\n", headers, "\n", body)
http.post(url, headers, body, loginPostCallback)
*X-CSRF-TOKEN and JSESSIONID in this example are dummy values. In the full script they are got from the response of a previous GET request
所以我尝试从命令行使用 curl
执行相同的操作,我完全没有问题。
curl -v -H "Content-Type: application/x-www-form-urlencoded\r\nConnection: keep-alive\r\nAccept: */*\r\nJSESSIONID=F7A9D7FA7D9AF79D7F9ASD7FA97A979F7D7A" -b "JSESSIONID=F7A9D7FA7D9AF79D7F9ASD7FA97A979F7D7A" -d "X-CSRF-TOKEN=a65sd464-6666-4bb4-4543-23k234tl234&username=admin&password=admin" http://192.168.1.4:8080/login
然后,我在服务器上跟踪请求,并将发送我的 lua 脚本的内容与 curl 发送的内容进行比较,我发现 lua http.post()
总是发送一个"Connection: close"
header,即使我明确设置 "Connection: keep-alive"
header - 也包括在内 -
查看我在 http.c, line 224 中看到的 NodeMCU http 库代码总是包含 "Connection: close"
header。
有谁知道他们为什么这样做?有什么方法可以发出 "Connection: keep-alive"
请求吗?
提前致谢
更新
我已经能够在服务器中进行身份验证,使用 net
库而不是 http
并发送 Connection: keep-alive
headers。无论如何,我的问题仍然没有得到解答,所以,除非管理员告诉我将我的解决方法作为解决方案发布并将问题标记为已解决,否则我将让它打开等待有人回答。
至少it's documented but the behavior has been like that from day 1。由于我没有编写该代码,因此我只能推测 "why"。因此,这个问题不太符合 Stack Overflow 的问答风格。
ESP8266 是一个非常受限的设备;内存和其他。因此,在 HTTP 连接超时或被服务器关闭之前不保持 HTTP 连接是有意义的。
我正在编写一个 lua 脚本,用于将一些数据发送到我使用 spring-boot 从我的 ESP8266 WeMOS LoLin 开发板开发的网络应用程序。为此,脚本必须首先在 webapp 上进行身份验证。问题是当我 POST 身份验证数据时,我在服务器日志中发现即使身份验证正确完成,session 也关闭了。
这是我的部分 lua 代码
print("Authenticating .........")
local url = getBaseUrl() .. '/login'
local body = 'username=' .. config.server.usr .. '&'..
'password=' .. config.server.pwd .. '&' ..
'X-CSRF-TOKEN=a65sd464-6666-4bb4-4543-23k234tl234'
local headers =
'Content-Type: application/x-www-form-urlencoded\r\n'..
'Connection: keep-alive\r\n'..
'Accept: */*\r\n' ..
'Cookie: JSESSIONID=F7A9D7FA7D9AF79D7F9ASD7FA97A979F7D7A'
print(url, "\n", headers, "\n", body)
http.post(url, headers, body, loginPostCallback)
*X-CSRF-TOKEN and JSESSIONID in this example are dummy values. In the full script they are got from the response of a previous GET request
所以我尝试从命令行使用 curl
执行相同的操作,我完全没有问题。
curl -v -H "Content-Type: application/x-www-form-urlencoded\r\nConnection: keep-alive\r\nAccept: */*\r\nJSESSIONID=F7A9D7FA7D9AF79D7F9ASD7FA97A979F7D7A" -b "JSESSIONID=F7A9D7FA7D9AF79D7F9ASD7FA97A979F7D7A" -d "X-CSRF-TOKEN=a65sd464-6666-4bb4-4543-23k234tl234&username=admin&password=admin" http://192.168.1.4:8080/login
然后,我在服务器上跟踪请求,并将发送我的 lua 脚本的内容与 curl 发送的内容进行比较,我发现 lua http.post()
总是发送一个"Connection: close"
header,即使我明确设置 "Connection: keep-alive"
header - 也包括在内 -
查看我在 http.c, line 224 中看到的 NodeMCU http 库代码总是包含 "Connection: close"
header。
有谁知道他们为什么这样做?有什么方法可以发出 "Connection: keep-alive"
请求吗?
提前致谢
更新
我已经能够在服务器中进行身份验证,使用 net
库而不是 http
并发送 Connection: keep-alive
headers。无论如何,我的问题仍然没有得到解答,所以,除非管理员告诉我将我的解决方法作为解决方案发布并将问题标记为已解决,否则我将让它打开等待有人回答。
至少it's documented but the behavior has been like that from day 1。由于我没有编写该代码,因此我只能推测 "why"。因此,这个问题不太符合 Stack Overflow 的问答风格。
ESP8266 是一个非常受限的设备;内存和其他。因此,在 HTTP 连接超时或被服务器关闭之前不保持 HTTP 连接是有意义的。