(Untitled)

Mar 21, 2013 12:42

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('172.16.1.1',80))
s.send('POST /proto/result.php HTTP/1.0\nHost: test\n\n')
s.close()

Leave a comment

display_none March 21 2013, 12:06:21 UTC
В чем WTF? В незнании httplib?
В том что в HTTP 1.0 не было заголовка Host?

Reply

dil March 21 2013, 12:23:55 UTC
А это не версия запроса. Это версия протокола, которую клиент полностью поддерживает и в которой хочет получить ответ.

Reply

display_none March 21 2013, 12:47:14 UTC
А вот RFC с Вами не согласен: (rfc2616, section-3.1)

The protocol versioning policy is intended to allow
the sender to indicate the format of a message and its capacity for
understanding further HTTP communication

Даже если некий сервер поймет Host несмотря на HTTP 1.0 (хотя может и не понять) то делать так все равно плохо: Сервер может и не поддерживать HTTP 1.1, и тогда вместо ошибки "unsupported protocol" (или bad request или что там должно быть?) просто выдаст контент с единственного сайта на этом IP.
И это будет грустно:)

Reply

dil March 21 2013, 13:10:53 UTC
RFC 2145, раздел 2:
The minor version sent in a message MUST NOT indicate the interpretation of other header fields. This reflects the principle that the minor version labels the capability of the sender, not the interpretation of the message.

Reply

display_none March 21 2013, 16:15:01 UTC
Наличие MUST NOT в Вашей цитате явно делает ее более приоритетной чем моя, так что Вы видимо правы.
Однако остается проблема с HTTP 1.0 сервером: он молча заигнорит заголовок и выдаст не то, что ждет клиент.

Впрочем этому клиенту пофиг что выдадут: он даже статус код не читает: сразу отваливается

Reply

yatur March 21 2013, 15:05:52 UTC
ИМХО, главный WTF в том, чтобы послать запрос и, не дождавшись ответа, закрыть сокет. ИМХО, результат может быть любым. Ну и посылать Host с HTTP/1.0 - это тоже неортодоксально. Даже если формально RFC это разрешает, я бы не стал ставить такие эксперименты.

Reply

display_none March 21 2013, 15:36:27 UTC
Потому что httplib есть, зачем вообще свое что-то писать?

Reply

alamar March 21 2013, 20:57:51 UTC
HTTP/1.0 существовал десять лет, когда Host: уже был.
wget не умеет 1.1, а Host: умел всегда.

Reply

weirdan March 26 2013, 12:13:19 UTC
Умеет он http/1.1:

/home/sam/rwvariants❯ wget -d https://google.com
DEBUG output created by Wget 1.14 on linux-gnu.

URI encoding = ‘UTF-8’
--2013-03-26 14:11:24-- https://google.com/
Resolving google.com (google.com)... 173.194.70.102, 173.194.70.101, 173.194.70.100, ...
Caching google.com => 173.194.70.102 173.194.70.101 173.194.70.100 173.194.70.139 173.194.70.138 173.194.70.113 2a00:1450:4001:c02::8a
Connecting to google.com (google.com)|173.194.70.102|:443... connected.
Created socket 5.
Releasing 0x0000000002491810 (new refcount 1).

---request begin---
GET / HTTP/1.1
User-Agent: Wget/1.14 (linux-gnu)
Accept: */*
Host: google.com
Connection: Keep-Alive
.....

Reply

alamar March 26 2013, 12:19:20 UTC
Wget 1.13, released August 2011, supports HTTP/1.1, fixed some portability issues, and used the GnuTLS library by default for secure connections.
Да, сознаюсь, у меня немного устаревшие данные.

Reply


Leave a comment

Up