HTTP/1.1 400 Неверный запрос. Плохое количество командных частей

Я пытаюсь выполнить следующий код из главы 12 книги «Python для информатики».

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
while True:
    data = mysock.recv(512)
    if ( len(data) < 1 ) :
        break
    print data
mysock.close()

Согласно книге, скрипт должен напечатать следующее:

HTTP/1.1 200 OK Дата: Воскресенье, 14 марта 2010 г., 23:52:41 по Гринвичу Сервер: Apache Последнее изменение: Вт, 29 декабря 2009 г., 01:31:22 по Гринвичу ETag: «143c1b33-a7-4b395bea». Content-Length: 167 Connection: close Content-Type: text/plain Но мягкий свет, что пробивается сквозь вон то окно Это восток и Джульетта это солнце Встань прекрасное солнце и убей завистливую луну Которая уже больна и бледна от горя

К сожалению, данные переменной заполнены следующей строкой:

'HTTP/1.1 400 Неверный запрос. Неверное количество частей команды ['GET', 'http://www.py4inf.com/code/romeo.txt', 'HTTP/1.0', 'X-WS-Ver:', '1.0']'

Я не могу найти хорошего объяснения этой ошибке. Я надеюсь, что кто-то может помочь!


person Arjan Groen    schedule 27.09.2016    source источник
comment
Вы настроены на использование сокетов для этого? Вы можете использовать библиотеку запросов: requests.get(url).text.   -  person postelrich    schedule 27.09.2016
comment
Я получаю HTTP/1.1 200 OK запуск приведенного выше кода.   -  person Ahmad    schedule 27.09.2016
comment
'GET /code/romeo.txt HTTP/1.1\r\nHost: www.py4inf.com\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\n\r\n' я удаляю ответ, потому что требуется много определений для каждого исключения или шага.   -  person dsgdfg    schedule 27.09.2016


Ответы (1)


В вашей установке Python, на машине или в вашей сети что-то переписывает запросы и внедряет свой собственный код. Главные подозреваемые

  • Все, что продается как «Антивирус»
  • Все, что позиционируется как «Решение для сетевой безопасности».
  • Вредоносное ПО на вашем компьютере или роутере
  • Общесетевой (прозрачный) прокси
  • Библиотека в вашей программе или установке Python
  • Ваш интернет-провайдер или сетевой администратор

Этот сервис хочет, в вашем случае, внедрить совершенно бесполезный заголовок X-WS-Ver. Однако интерпретация HTTP этой службой более строгая, чем у вас и у сервера py4inf.com; Строки HTTP должны заканчиваться на \r\n, но вы используете только \n. Этот сервис изменяет данные, которые вы отправили на

GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\nX-WS-Ver: 1.0\r\n\r\n

или что-то подобное. Это, конечно, очень ошибочное поведение этой службы. Поскольку новый запрос больше не является действительным HTTP, py4inf.com вернет сообщение об ошибке, правильно указав, что полученный запрос искажен (400 Bad request).

Чтобы ваша программа заработала, вы можете выбрать любой из следующих вариантов:

  • Если что-то на вашем локальном компьютере является проблемой, отключите нарушающую службу (если она бесполезно и неправильно изменяет соединения, в любом случае это вряд ли обеспечит большую безопасность) или используйте другую машину.
  • Получите неограниченный доступ к сети, возможно, с помощью провайдера VPN
  • Отправить правильный HTTP, т.е.
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\r\n\r\n')
#                                                             ^^  ^^
  • Используйте зашифрованное соединение (с модулем Python ssl), т. е. URL-адреса. по схеме https://.
person phihag    schedule 27.09.2016
comment
Здорово! Из интереса: вы не знаете, какая служба может молча изменять ваши данные? Я изучил его еще немного, и единственная ссылка на этот заголовок, которую я смог найти, была вредоносной программой, что также объясняет очень дрянную реализацию. Можете ли вы воспроизвести исходную проблему на другом компьютере (если возможно, с другой операционной системой) в той же сети или на текущем компьютере в другой сети? - person phihag; 27.09.2016
comment
Я должен был бы проверить это, но, поскольку у меня есть значительное количество программного обеспечения для обеспечения безопасности, я подозреваю, что это так. - person Arjan Groen; 27.09.2016