Python recv对某些网站失败了

时间:2013-02-06 00:15:34

标签: python http sockets

我使用Python的套接字模块编写了一个非常基本的轮询代理Web服务器。对于代理,我使用socket的recv()函数编写了一个简单的readline()。

它是这样的:

def readline(socket):
    buffer = ''
    char = socket.recv(1)
    while char != '\n' and char != '':
        buffer += char
        char = socket.recv(1)
    if char == '':
        buffer = ''
    else:
        buffer += '\n'
    return buffer

根据我的理解,如果recv()返回一个空字符串,这意味着存在套接字错误或者一方已关闭其连接,因此当发生这种情况时,我返回 一个空字符串到我的代理,让它知道readline()失败。

运行代理时,我可以访问youtube.com和yahoo.com等网站,但每当我尝试访问www.google.com时,我的readline函数始终返回一个空字符串 在第一个readline上(读取HTTP请求中的请求行)。

有什么想法吗?

修改 对不起我想我不清楚。当我在地址栏中输入“http://www.google.com/”时,我正在等待我的Mozilla Firefox客户端发送到我的代理服务器的请求,这就是我要挂的地方。我甚至没有到达我将请求转发到远程服务器的部分并发回响应。

1 个答案:

答案 0 :(得分:1)

我认为Google可能会在第一时间等待您的请求标头,如果它不会授权您将关闭连接。你没有阅读请求,你正在发送请求。你读到的是回复。

但它可能与发送的标题不同。

- 更新 -

尝试在连接后发送这些标题。

GET / HTTP/1.1
Host: google.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17
X-Chrome-Variations: CM61yQEIk7bJAQiatskBCKa2yQEIp7bJAQiptskBCLi2yQEI34PKAQ==
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US;q=0.6,en;q=0.4
Accept-Charset: utf-8;q=0.7,*;q=0.3

您还可以查看您的浏览器向Google发送的标题以及您使用firebug获得的回复。