Запрос HTTP GET через fsockopen() возвращает посторонние символы

Я использую fsockopen() для запроса значения со страницы на другом сервере. Возвращаемое значение представляет собой одно слово (например, "французский"). Это отлично работает, когда я тестирую на локальном хосте (MAMP), делая запрос на удаленный сервер. Однако, когда я тестирую сервер-сервер, я получаю дополнительные символы, такие как:

6%0D%0AFrench%0D%0A0%0D%0A%0D%0A or 7%0D%0AEnglish%0D%0A0%0D%0A%0D%0A

Я использую функцию http_request(), показанную здесь. Единственное изменение, которое я сделал, это увеличить время ожидания. Я вызываю это, используя:

$thelanguage = http_request('GET', $domain, 80, $path);

Я тестировал это на нескольких серверах и с них, и дополнительные символы появляются, когда я делаю запрос из из любого места, кроме локального хоста.

Я немного в недоумении, как поступить. Похоже, что 6 или 7 в начале возвращаемых строк — это количество символов, но я понятия не имею, откуда это взялось. Любая помощь будет принята с благодарностью.


person ggutenberg    schedule 30.03.2011    source источник
comment
Я знаю, что это ненадежно, но не могли бы вы удалить эти посторонние данные?   -  person alex    schedule 30.03.2011
comment
Я буду считать это крайней мерой. Поскольку дополнительные данные немного меняются в зависимости от возвращаемого слова, это не совсем надежно. Также я не знаю всех слов, которые в конечном итоге будут возвращены, поэтому я не могу проверить все случаи.   -  person ggutenberg    schedule 30.03.2011


Ответы (1)


Похоже, что 6 или 7 в начале возвращаемых строк являются количеством символов,

Ага! Вы видите фрагментированное кодирование передачи: длина данных, CRLF, данные, а затем еще две пары CRLF. . Я считаю, что последний CRLF означает, что это был последний фрагмент.

Вы, вероятно, захотите использовать более хорошо разработанный, хорошо протестированный, полнофункциональный механизм HTTP-запросов, такой как обычно встроенный расширение curl или HTTP_Request2 PEAR.

person Charles    schedule 30.03.2011
comment
Я бы хотел (первоначально это было сделано с использованием cURL), но этот скрипт будет распространяться среди клиентов для запуска на их серверах, над которыми я не контролирую. Я обеспокоен тем, что в некоторых случаях cURL или PEAR не будут установлены/включены, поэтому я пытаюсь использовать наименьший общий знаменатель. - person ggutenberg; 30.03.2011
comment
@dosboy, HTTP_Request2 выпущен под лицензией BSD, поэтому вы можете просто связать его (и необходимый Net_URL2) со своим кодом. Он включает в себя адаптеры как для raw-сокетов, так и для curl, так что он должен работать довольно хорошо практически везде. - person Charles; 30.03.2011
comment
Я изучу HTTP_Request2. Тем временем, хотя вы поставили меня на правильный путь. Я только что добавил заголовок Content-Length на страницу ответа, и больше никаких фрагментов! Спасибо! - person ggutenberg; 30.03.2011