我有以下飞镖计划:
import "dart:io";
import "dart:convert" show UTF8;
void main() {
HttpClient client = new HttpClient();
client.badCertificateCallback = (certificate, host, callbackPort) {
print("In bad certificate callback.");
return true;
};
client.getUrl(Uri.parse("https://www.self.signed.url.com/api")).then((HttpClientRequest request) {
print("In request callback.");
return request.close();
}).then((HttpClientResponse resp) {
print("In responce callback.");
});
}
此代码向网址发出get请求。该URL使用自签名证书,这会导致SSL错误。为了解决这个问题,我将badCertificateCallback
的{{1}}设置为始终返回true,从而有效地接受所有证书。
使用此代码,我希望看到以下输出:
HttpClient
然后让程序退出。相反,我看到了:
In request callback.
In bad certificate callback.
In responce callback.
程序挂起。关于我做错了什么想法?
更新:根据一些评论的建议,我提交了一个Dart错误。它可以找到here。如果有任何结果,我会将结果反馈到此。
答案 0 :(得分:2)
事实证明,它与HTTPS无关,而是在https://checkmate.fogbugz.com/api.xml服务器上处理HTTP协议。 Dart HTTP堆栈以小写形式发送所有头字段名称。服务器无法正确处理。
以下代码说明了这一点:
import 'dart:io';
import 'dart:convert';
void main() {
SecureSocket.connect("checkmate.fogbugz.com", 443).then((socket) {
socket.write("GET /api.xml HTTP/1.0\r\n"
"host: checkmate.fogbugz.com\r\n"
"\r\n");
socket.listen((data) => print(UTF8.decode(data)));
});
}
未收到任何回复。如果host:
更改为Host:
,则会收到回复。
RFC 2616 section 4.2声明:'字段名称不区分大小写。'