.net HttpClient запрос к C openssl серверу: SSL_read получает 1 байт, SSL_pending говорит false, но мгновенный второй SSL_read получает остальные мои данные - PullRequest
0 голосов
/ 29 сентября 2019

если я позвоню своему веб-серверу с помощью 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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...