我正在编写一个lua脚本,将一些数据发送到我使用我的ESP8266 WeMOS LoLin板上的spring-boot开发的webapp . 为此,脚本必须首先在webapp上进行身份验证 . 问题是当我发布身份验证数据时,我发现在我的服务器日志中,即使身份验证正确完成,会话也会关闭 .
这是我的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和JSESSIONID是虚拟值 . 在完整脚本中,它们来自先前GET请求的响应
所以我尝试使用 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"
标头,即使我明确设置 "Connection: keep-alive"
标头 - 其中也包括 - .
查看我在http.c, line 224中看到的NodeMCU http库代码始终包含 "Connection: close"
标头 .
有谁知道他们为什么要这样做?有没有办法让 "Connection: keep-alive"
请求?
提前致谢
更新
我已经能够在服务器上进行身份验证,使用 net
库而不是 http
并发送 Connection: keep-alive
标头 . 无论如何,我的问题仍然没有答案,所以,除非管理员告诉我将我的解决方案作为解决方案发布并将问题标记为已解决,否则我将保持开放状态等待有人回答 .
1 回答
至少it's documented但行为一直是like that from day 1 . 因为我没有适应Stack Overflow Q&A风格 .
ESP8266是一种非常受限制的设备;记忆 - 或其他 . 因此,在服务器超时或关闭之前不保持HTTP连接存活,确实有意义 .