2017-01-15 4 views
0

Python 3でrawソケットを使用して単純なHTTPクライアントプログラムを作成しようとしていますが、サーバーは単純なHTTP要求を送信しても応答を返しません。私の質問は、なぜサーバーが応答を返さないのかということです。ここでWebサーバーが応答を送信しない

私のコードです:

from socket import * 

BUF_LEN = 8192 * 100000 

info = getaddrinfo('google.com', 80, AF_INET) 
addr = info[-1][-1] 
print(addr) 

client = socket(AF_INET, SOCK_STREAM) 

client.connect(addr) 

client.send(b"GET /index.html HTTP1.1\r\nHost: www.google.com\r\n") 
print(client.recv(BUF_LEN).decode("utf-8")) # print nothing 

答えて

2

あなたが最後に空白行を逃し、スラッシュなしでHTTPのバージョンを誤って指定した:

>>> client.send(b"GET /index.html HTTP1.1\r\nHost: www.google.com\r\n") 

は次のようになります。

>>> client.send(b"GET /index.html HTTP/1.1\r\nHost: www.google.com\r\n\r\n") 
50 
>>> client.recv(BUF_LEN).decode("utf-8") 
u'HTTP/1.1 302 Found\r\nCache-Control: private\r\nContent-Type: text/html; charset=UTF-8\r\nLocation: http://www.google.co.uk/index.html?gfe_rd=cr&ei=fIR7WJ7QGejv8AeZzbWgCw\r\nContent-Length: 271\r\nDate: Sun, 15 Jan 2017 14:17:32 GMT\r\n\r\n<HTML><HEAD><meta http-equiv.... 

空白行は、サーバーにヘッダーの末尾を伝えます。これはGET要求であるため、ペイロードがないため、コンテンツを返します。

HTTP/1.1仕様で/を指定しないと、GoogleのサーバーはError:400 Bad Request応答を返します。

関連する問題