Почему digest запрос в fopen возвращает ответ только в 1 из 10 случаев?

Ссылка скопирована
PHP
1 ответ
# первый запрос $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 не отображается. Как понять, по какой причине и устранить её?

Дополнительно:

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь Волков Ответ

Проблема, когда 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);

$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);

Если после проверки всех вышеперечисленных причин проблема не будет решена, рекомендуется обратиться к администратору сервера или специалисту по работе с сетями для дальнейшего анализа и устранения проблемы.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно