Плохой запрос Python к серверу - PullRequest
0 голосов
/ 06 февраля 2019

Я написал следующую программу для добавления HTTP-запроса в Python:

import socket
mysock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org',80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n'.encode()
mysock.send(cmd)
print('first half done')
while True:
    data = mysock.recv(512)
    if (len(data) < 1):
        break
    print(data.decode())
mysock.close()

Вот результат после запуска Python.

HTTP/1.1 400 Bad Request
Date: Wed, 06 Feb 2019 00:09:46 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 308
Connection: close
Content-Type: text/html; charset=iso-8859-1
Your browser sent a request that this server could not understand.

Может кто-нибудь сказать мне, как решить эту проблему?

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема вызвана окончанием строки.Вместо \n попробуйте использовать \r\n:

cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()

Это поведение объясняется в RFC2616 :

Завершитель строки для заголовка сообщенияПоля это последовательность CRLF.Однако мы рекомендуем приложениям при разборе таких заголовков распознавать один LF в качестве ограничителя строки и игнорировать начальный CR.

Очевидно, что веб-сервер (Apache/2.4.18 (Ubuntu)) не следует приведенной выше рекомендации.и принимает только CRLF (\r\n) в качестве ограничителя строки.

...