если я позвоню своему веб-серверу с помощью Chrome или iexplore, все это будет работать нормально.Я получаю полный запрос в одном SSL_read, это простой GET менее 100 символов.
Если я использую .net HttpClient, мне нужно сделать 2 SSL_Reads на сервере следующим образом:
Вопросыдля .net HttpClient: Почему ВСЕГДА только 1 байт при первом чтении?Если мне нужно снова вызвать SSL_read, почему ожидание говорит об обратном?
Спасибо.
int cb = SSL_read(ssl, pbReq, cbReq - 1);
if (1 > cb)
{
int sslN = SSL_get_error(ssl, cb);
char sslM[CCH_STATUS_MSGM] = { 0 };
NetSSLStatusGet(sslM, _countof(sslM), sslN);
error(" SSL_read:[%u][0x%X] sslN:[%u][0x%X] [%s]",
cb, cb,
sslN, sslN, sslM);
cbReq = 0;
pbReq[0] = 0;
}
debug("cb:[%u][0x%X]", cb, cb);
int pending = SSL_pending(ssl);
warn( "SSL_pending:[%u][0x%X]", pending, pending);
cb = SSL_read(ssl, pbReq, cbReq - 1);
if (1 > cb)
{
int sslN = SSL_get_error(ssl, cb);
char sslM[CCH_STATUS_MSGM] = { 0 };
NetSSLStatusGet(sslM, _countof(sslM), sslN);
error(" SSL_read:[%u][0x%X] sslN:[%u][0x%X] [%s]",
cb, cb,
sslN, sslN, sslM);
cbReq = 0;
pbReq[0] = 0;
}
debug("cb:[%u][0x%X]", cb, cb);
Производит
11580 145 DEBUG NetSSLRead cb:[1][0x1]
11580 148 WARN NetSSLRead SSL_pending:[0][0x0]
11580 164 DEBUG NetSSLRead cb:[114][0x72]
И первый байт 'G'отсутствует, он был получен в исходном чтении
ET /MYOP?x=003&y=7... HTTP/1.1
Host: 10.0.0.12:9443
Connection: Keep-Alive
Fiddler Raw:
GET https://10.0.0.12:9443/MYOP?x=003&y=7... HTTP/1.1
Host: 10.0.0.12:9443
Connection: Keep-Alive
.net код клиента:
ServicePointManager.ServerCertificateValidationCallback =
new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
ServicePointManager.ServerCertificateValidationCallback +=
new System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);
using (var client = new HttpClient())
{
var tid = System.Threading.Thread.CurrentThread.ManagedThreadId;
//string s = "https://10.0.0.12:8443/php/vars.php";
string s = "https://10.0.0.12:9443/MYOP?x=003&y=7";
System.Console.WriteLine(s);
var response = client.GetAsync(s).Result;
// System.Console.WriteLine(response.ToString());
if (response.IsSuccessStatusCode)
{
var responseContent = response.Content;
// by calling .Result you are synchronously reading the result
string responseString = responseContent.ReadAsStringAsync().Result;
Console.WriteLine(responseString);
}
}
}
//for testing purpose only, accept any dodgy certificate...
public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
public static bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
return true;
}