Зачем нам нужен возврат каретки \ r перед символом новой строки \ n? - PullRequest
0 голосов
/ 04 мая 2020

В следующем коде протоколу HTTP нужны два символа новой строки, но зачем там нужен \ r. Почему мы не можем просто добавить два \ n и отправить запрос?

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\r\n\r\n'.encode() # here
mysock.send(cmd)
while True:
    data = mysock.recv(512)
    if len(data) > 0:
        print(data.decode())
    else :
        break
mysock.close()

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Потому что так работает протокол HTTP.

Строка запроса / состояния и заголовки должны заканчиваться на (то есть возврат каретки с последующим переводом строки). Пустая строка должна состоять только из пустых пробелов.

https://en.wikipedia.org/wiki/HTTP_message_body

1 голос
/ 04 мая 2020

Потому что так определяется протокол HTTP . В частности, HTTP 1.0 определяет запрос , например, :

Request        = Simple-Request | Full-Request

Full-Request   = Request-Line             
                 *( General-Header       
                  | Request-Header      
                  | Entity-Header )    
                 CRLF
                 [ Entity-Body ]

Request-Line = Method SP Request-URI SP HTTP-Version CRLF

Full-Request, который должен использоваться любым клиентом, совместимым с HTTP 1.0 (простой запрос - HTTP 0.9 и не рекомендуется ) необходимо иметь два токена CRLF (один находится в Request-Line). Токен CRLF - это два байта \r\n. Следовательно, в вашем примере необходимо завершить строку \r\n\r\n.

Этот вариант дизайна был сохранен в HTTP 1.1.

...