2016-09-27 7 views
1

Im пытается выполнить следующий код из главы 12 книги «Python for Informatics».HTTP/1.1 400 Плохой запрос. Плохое количество командных частей

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 GMT сервер: Apache Последняя -Modified: вт, 29 декабря 2009 1:31:22 GMT ETag: "143c1b33-a7-4b395bea" Accept-Диапазоны: байты Content-Length: 167 Подключение: закрыть Content-Type: текст/обычный Но мягкий, какой свет вон там Окно ломает Это восток и Джульетта солнца Встаньте справедливое солнце и убить завистливые луны Кто уже болен и бледные от горя

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

'HTTP/1.1 400 Bad Request. Плохое количество командных частей [ 'GET', 'http://www.py4inf.com/code/romeo.txt', 'HTTP/1.0', 'X-WS-Ver:', '1,0']»

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

+0

Вы используете для этого сокеты? Вы можете использовать библиотеку запросов: 'request.get (url) .text'. – postelrich

+0

Я получаю «HTTP/1.1 200 OK», выполняя вышеуказанный код. – Ahmad

+0

''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'' я удаляю ответ, потому что требуется много определений для каждого исключения или шагов. – dsgdfg

ответ

1

На вашей установке, машине или вашей сети Python что-то переписывает запросы и вводит свой собственный код. Премьер подозреваемых

  • Все продается как "Anti-Virus"
  • Anything продаваемого как "Сетевое решение безопасности"
  • вредоносных программ на вашем компьютере или маршрутизаторе
  • всей сети (прозрачный) прокси
  • библиотека в программе 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') 
#                ^^ ^^ 
  • Используйте шифрованное соединение (с ssl модулем языка Python), то есть URL, под https:// схеме.
+0

Благодарим за хорошее объяснение, решение 3 работает –

+0

Отлично! Из интереса вы знаете, какой сервис можно было бы молча изменить ваши данные? Я просмотрел его еще несколько, и единственной ссылкой на этот заголовок, который я смог найти, было вредоносное ПО, которое также объясняло бы очень дрянную реализацию. Можете ли вы воспроизвести исходную проблему с другим компьютером (если возможно с другой операционной системой) в той же сети или с текущим компьютером в другой сети? – phihag

+0

Мне нужно было бы это проверить, но поскольку у меня есть большое количество программного обеспечения для обеспечения безопасности, я подозреваю, что это так. –

-1

Вы должны изменить mysock.send ('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0 \ п \ п') к

mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\r \n') 

Чтобы правильно завершить поток байтов, вам нужно использовать «\ г \ n ", также: не следует ли использовать байтовый объект для сокетов?

+0

К сожалению, это приводит к тому же выводу. –

+0

Вы также можете попробовать «\ r \ n \ r \ n» в конце, что должно работать. – Jerrynicki