Python recv在某些网站上失败

Python recv在某些网站上失败,python,http,sockets,Python,Http,Sockets,我已经使用Python的套接字模块编写了一个非常基本的轮询代理web服务器。对于代理,我使用套接字的recv()函数编写了一个简单的readline() 事情是这样的: def readline(socket): buffer = '' char = socket.recv(1) while char != '\n' and char != '': buffer += char char = socket.recv(1) if ch

我已经使用Python的套接字模块编写了一个非常基本的轮询代理web服务器。对于代理,我使用套接字的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函数总是返回一个空字符串 在第一个读取行上(读取HTTP请求中的请求行)

有什么想法吗

编辑:
对不起,我想我不清楚。当在地址栏中键入“”时,我正在等待Mozilla Firefox客户端向代理服务器发送的请求,而我挂起的正是地址栏。我甚至还没有谈到将请求转发到远程服务器并发送回响应的部分。

我认为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得到的响应。

对不起,我想我不清楚。当在地址栏中键入“”时,我正在等待Mozilla Firefox客户端向代理服务器发送的请求,而我挂起的正是地址栏。我甚至还没有到达将请求转发到远程服务器并返回响应的部分。好吧,我误解了。尝试打印使用recv()获得的所有内容,并捕捉连接关闭的时刻。如果它是因为您获得了空数据而关闭的,那么请注释掉您的关闭代码,然后等待其余的数据来检查浏览器正在发送什么。使用这些信息进行调试会更容易。奇怪的是,我的服务器现在运行良好,而我没有弄乱它。不过你的建议确实很有帮助。