【发布时间】:2011-08-27 22:08:06
【问题描述】:
我用 C 语言编写了一个小 HTTPS 客户端,但我遇到了 SSL_write 函数的问题。 三个测试来说明我的问题:
#define HEADERS1 "GET / HTTP/1.1\r\n"
#define HEADERS2 "Host: www.example.com\r\n"
#define HEADERS3 "User-Agent: OpenSSL\r\n"
#define HEADERS4 "\r\n"
#define HEADERS "GET / HTTP/1.1\r\nHost: www.example.com\r\nUser-Agent: OpenSSL\r\n\r\n"
测试 1:
SSL_write(ssl,HEADERS,strlen(HEADERS));
成功:服务器正确返回带有 HTTP/1.1 200 代码的 /index.html 资源。
测试 2:
SSL_write(ssl,HEADERS1,strlen(HEADERS1));
SSL_write(ssl,HEADERS2,strlen(HEADERS2));
SSL_write(ssl,HEADERS3,strlen(HEADERS3));
SSL_write(ssl,HEADERS4,strlen(HEADERS4));
失败:服务器没有返回任何东西。所有 SSL_write 函数都不会返回 ERROR,但我的应用程序被锁定在 SSL_read 上,因为目标服务器没有提供任何内容......也没有标题:(
测试 3:
SSL_write(ssl,HEADERS1,strlen(HEADERS1));
SSL_write(ssl,HEADERS2,strlen(HEADERS2));
SSL_write(ssl,HEADERS4,strlen(HEADERS4));
成功:服务器正确返回带有 HTTP/1.1 200 代码的 /index.html 资源。
我可以调用 SSL_write 发送标头的次数是否有特别限制?很奇怪……
非常感谢!
好的,我的问题仍然存在,但我有更多细节:
IISS-SSL => 所有测试成功。
Apache-SSL => 所有测试成功。
Nginx-SSL => 所有测试成功。
LightHTTPD-SSL => 测试 2 失败。
我不明白为什么只有 LightHTTPD 不明白我的请求...
【问题讨论】:
-
也许在调试的情况下运行服务器并查看日志可能会有所帮助。您也可以尝试捕获流量(wireshark 可以解密,如果提供了服务器密钥)。
-
您还应该检查
SSL_write可能返回的错误。 -
谢谢 n.m.问题已解决。问题是来自 LightHTTPD (redmine.lighttpd.net/issues/2197) 的错误,它存在于旧版本中...