Как отладить ошибку 56 CURL на конечных точках API - PullRequest
1 голос
/ 08 апреля 2020

У меня есть установка WordPress, которая использует. NET API, размещенные на другом сервере. В последнее время я столкнулся с этой проблемой, когда моя установка WordPress на Apache / Linux постоянно получала ошибку CURL 56 на нескольких конечных точках. После большой неудачной отладки я перешел в среду Windows / IIS, где все работало нормально.

Теперь, внезапно, я начал получать ту же ошибку и в Windows / IIS. Потрясающая часть заключается в том, что внешние API, которые я вызываю, размещены на одном сервере. Но среди них некоторые работают нормально, а другие выдают ошибку CURL 56.

Так, например, если я позвоню:

https://example.com/api/v5/Members/SignIn

Это прекрасно работает. Но когда я звоню:

https://example.com/api/v5/Members/VerifyDuplicateAccount

Это внезапно заканчивается кодом ошибки CURL 56. Сообщение об ошибке, которое я получаю от curl_error, выглядит следующим образом:

OpenSSL SSL_read: Connection was reset, errno 10054

Я потратил впустую дней выяснить проблему, но не удалось. Я попытался обновить php_curl до 7.6.8, обновил PHP до 7.4.4, но пока ничего не помогло.

Вот тестовый сценарий, который я написал для отладки:

    <?php
        ob_start();  
        $out = fopen('php://output', 'w');

        $_headers = array(
          'Content-Type: application/json',
          'Authorization: Bearer 5579PP5HSfZXjWZ9kpqEn9ST7BaWhTrcEUghL7Z_sRpGKXTmh40WxdfJ-9F7pe5LwHY9w0DH6v8r7HQrNke3JjonWwFRwTV-_8JEUuwudrKf6Ii1QSTGWtkaZ_GRZVWbN8eUh5BzPnRnzF8JQ_Goq_dx0cXQYqewQHG7iAU1aSifatwbAZLY-h_GGBTnJ72uZ6ZNix8E-7Th4Pftrpqx5bytay0fY1ES5ppuqDn4h-9TakZEedwnpzup30ApphTGGQxYAGrkRArEj0nXXV2yH8lHUL8SrZJKc9SGaE8y6qtxQc_F50imU-f8fb5P2WSNaPeYEaYJ2o6dj1r7A9VuiabCxMsdAzIFvlyPSrcdpGO1uBRoTVwVBMmH7prpFRzKWYrX69BF-IET4rN8POT1Zg',
          'Expect: '
        ); //print_r($_headers);
        $params = '{"OwnerDescription":"myOwner","UserAgent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/80.0.3987.149 Safari\/537.36","VendorKey":"abc123","address":{"HomeAddress":{"CountryCode":"US","StateProvinceAbbrevation":"GA","Line1":"Test ADDRESS","City":"ATL","PostalCode":"30003"},"MailingAddress":{"CountryCode":"US","StateProvinceAbbrevation":"GA","Line1":"Test ADDRESS","City":"ATL","PostalCode":"30003"},"BillingAddress":{"CountryCode":"US"}},"contactInfo":{"PrimaryContactNumber":"1234334444","Email":"xyzm@gmail.com"},"membership":{"Members":[{"FirstName":"Osama","MiddleName":"","LastName":"Trankler","ParticipantType":"Primary","Gender":"NotAvailable","DateOfBirth":"11\/12\/1998"}],"EffectiveDate":"04\/08\/2020","Term":null,"TermLength":null,"PlanName":"ABC"}}';
        $curl = curl_init();
        $url = 'https://example.com/api/v5/Members/VerifyDuplicateAccount';
        curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $_headers);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, TRUE);
        curl_setopt($curl, CURLOPT_TIMEOUT, 600);
        curl_setopt($curl, CURLOPT_FAILONERROR, TRUE);
        curl_setopt($curl, CURLOPT_VERBOSE, TRUE);
        if ($response = curl_exec($curl)) {
        } else {
          $response = curl_error($curl);
        }
        echo 'curl_error=>'.curl_errno($curl);
        @curl_close($curl);
        fclose($out);  
        $debug = ob_get_clean();
        echo 'debug=> '.$debug;
        print_r($response);

    ?>

И вот ответ, который я получаю:

    * Trying 199.1.1.1:443...
    * TCP_NODELAY set
    * Connected to example.com (199.1.1.1) port 443 (#0)
    * ALPN, offering h2
    * ALPN, offering http/1.1
    * successfully set certificate verify locations:
    *   CAfile: C:\curl_cert\cacert.pem
      CApath: none
    * SSL connection using TLSv1.2 / ECDHE-RSA-AES256-SHA384
    * ALPN, server did not agree to a protocol
    * Server certificate:
    *  subject: C=US; ST=Texas; L=Lewisville; O=ABC Holdings LLC
    T; CN=*.example.com
    *  start date: Nov 13 00:00:00 2019 GMT
    *  expire date: Nov 17 12:00:00 2021 GMT
    *  issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=DigiCert SHA2 Hig
    rance Server CA
    *  SSL certificate verify ok.
    > PUT /api/v5/Members/VerifyDuplicateAccount HTTP/1.1
    Host: example.com
    Accept: */*
    Content-Type: application/json
    Authorization: Bearer 5579PP5HSfZX
    Content-Length: 1023

    * upload completely sent off: 1023 out of 1023 bytes
    * OpenSSL SSL_read: Connection was reset, errno 10054
    * Closing connection 0
    debug=> curl_error=>56 OpenSSL SSL_read: Connection was reset, errno 10054
...