Почему digest запрос в fopen возвращает ответ только в 1 из 10 случаев?
# первый запрос $resource = fopen($url, 'r'); p($http_response_header); # получение nonce preg_match('/nonce="([^"]+)"/', $http_response_header[1], $matches); $nonce = $matches[1]; # считаем request для digest $digest = calculateDigest($username, $password, $realm, $nonce, $uri, $method, $qop, $nc, $cnonce); // Настройки HTTP-заголовков $options = [ 'http' => [ 'method' => 'GET', 'header' => "Authorization: Digest username="{$username}", realm="{$realm}", nonce="{$nonce}", uri="{$uri}", response="{$digest}", opaque="{$opaque}", qop={$qop}, nc={$nc}, cnonce="{$cnonce}"", ], ]; # второй запрос $resource = fopen($url, 'r', false, stream_context_create($options)); p($http_response_header); // Чтение данных из файла (URL) while (!feof($resource)) { $response = fgets($resource); } // Закрытие ресурса fclose($resource); p($response); |
# первый запрос $resource = fopen($url, 'r'); p($http_response_header); # получение nonce preg_match('/nonce="([^"]+)"/', $http_response_header[1], $matches); $nonce = $matches[1]; # считаем request для digest $digest = calculateDigest($username, $password, $realm, $nonce, $uri, $method, $qop, $nc, $cnonce); // Настройки HTTP-заголовков $options = [ 'http' => [ 'method' => 'GET', 'header' => "Authorization: Digest username="{$username}", realm="{$realm}", nonce="{$nonce}", uri="{$uri}", response="{$digest}", opaque="{$opaque}", qop={$qop}, nc={$nc}, cnonce="{$cnonce}"", ], ]; # второй запрос $resource = fopen($url, 'r', false, stream_context_create($options)); p($http_response_header); // Чтение данных из файла (URL) while (!feof($resource)) { $response = fgets($resource); } // Закрытие ресурса fclose($resource); p($response);
запускаю в браузере и вижу такую картину:
Warning: fopen(http://myip/cgi-bin/mediaFileFind.cgi?action=factory.create): Failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized in C:OSPaneldomainscam.localuploader.php on line 54 Array ( [0] => HTTP/1.1 401 Unauthorized [1] => WWW-Authenticate: Digest realm="Login to bd72fbb2e0734a3cb18d4cb40504cdf0", qop="auth", nonce="2142598378", opaque="1a067f2162e6693bed2d111d38af7bee229a316f" [2] => Connection: close [3] => CONTENT-LENGTH: 0 ) Array ( [0] => HTTP/1.1 200 OK [1] => X-XSS-Protection: 1;mode=block [2] => X-Frame-Options: SAMEORIGIN [3] => Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval' [4] => Strict-Transport-Security: max-age=604800; includeSubDomains [5] => Content-type: text/plain;charset=utf-8 [6] => CONNECTION: close [7] => CONTENT-LENGTH: 19 ) |
Warning: fopen(http://myip/cgi-bin/mediaFileFind.cgi?action=factory.create): Failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized in C:OSPaneldomainscam.localuploader.php on line 54 Array ( [0] => HTTP/1.1 401 Unauthorized [1] => WWW-Authenticate: Digest realm="Login to bd72fbb2e0734a3cb18d4cb40504cdf0", qop="auth", nonce="2142598378", opaque="1a067f2162e6693bed2d111d38af7bee229a316f" [2] => Connection: close [3] => CONTENT-LENGTH: 0 ) Array ( [0] => HTTP/1.1 200 OK [1] => X-XSS-Protection: 1;mode=block [2] => X-Frame-Options: SAMEORIGIN [3] => Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval' [4] => Strict-Transport-Security: max-age=604800; includeSubDomains [5] => Content-type: text/plain;charset=utf-8 [6] => CONNECTION: close [7] => CONTENT-LENGTH: 19 )
Но если я обновлю страницу несколько раз, то увижу такую картину:
... [5] => Content-type: text/plain;charset=utf-8 [6] => CONNECTION: close [7] => CONTENT-LENGTH: 19 ) result=2134173032 |
... [5] => Content-type: text/plain;charset=utf-8 [6] => CONNECTION: close [7] => CONTENT-LENGTH: 19 ) result=2134173032
result - это как раз и есть вывод $response. То есть по какой-то причине result не отображается. Как понять, по какой причине и устранить её?
Дополнительно:
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Проблема, когда digest запрос в fopen возвращает ответ только в 1 из 10 случаев, может быть вызвана несколькими причинами. Ниже приведены некоторые из возможных причин и способы их решения:
1. Проблемы с сервером: Возможно, сервер, к которому вы обращаетесь, не поддерживает аутентификацию по протоколу digest или настроен неправильно. Убедитесь, что сервер правильно настроен для работы с digest аутентификацией.
2. Проблемы с кэшированием: Браузер или сервер может кэшировать результаты запросов, что может привести к непредсказуемому поведению при повторных запросах. Попробуйте отключить кэширование на стороне клиента или сервера.
3. Проблемы с сетью: Нестабильное соединение с сервером также может быть причиной проблемы. Убедитесь, что ваше соединение стабильно и нет проблем с сетью.
4. Проблемы с кодом: Ваш код, который отправляет запросы через fopen, может содержать ошибки, которые приводят к неправильной обработке ответов. Убедитесь, что ваш код корректно обрабатывает ответы от сервера и не содержит ошибок.
Пример использования fopen с digest аутентификацией в PHP:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://example.com/api'); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); curl_setopt($ch, CURLOPT_USERPWD, 'username:password'); $result = curl_exec($ch); if($result === false) { echo 'Error: ' . curl_error($ch); } else { echo 'Response: ' . $result; } curl_close($ch);
Если после проверки всех вышеперечисленных причин проблема не будет решена, рекомендуется обратиться к администратору сервера или специалисту по работе с сетями для дальнейшего анализа и устранения проблемы.