0

我使用 Python 的 socket 模块编写了一个非常基本的轮询代理 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 函数总是在第一个 readline 上返回一个空字符串(读取请求行在 HTTP 请求中)。

有任何想法吗?

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

4

1 回答 1

1

我认为谷歌可能会首先等待您的请求标头,如果它不授权您,它将关闭连接。而且您不是在阅读请求,而是在发送请求。你读的是回应。

但这可能与没有发送标头不同。

--更新--

尝试在连接后立即发送这些标头。

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

于 2013-02-06T00:21:31.917 回答