这几天我正在写一个转发代理人。
我遇到过HTTP / s代码的三个问题。 第一个是每当我试图处理重定向[302](例如来自www.google.com)时,我都没有得到任何数据。 我正在使用以下代码处理重定向:
try:
response = requests.get("http://"+webserver, timeout=2)
if response.history:
print "Redirected to " + response.url
c = httplib.HTTPSConnection(response.url, port,config['CONNECTION_TIMEOUT'])
else:
print "Getting information from " + webserver
c = httplib.HTTPSConnection(webserver, port,config['CONNECTION_TIMEOUT'])
except requests.exceptions.ConnectionError:
print "Getting information from " + webserver
c = httplib.HTTPSConnection(webserver)
如果我试图通过直接连接到重定向网址来绕过第一个错误,则会出现第二个问题。我从网站收到的数据(任何受http / s保护的网站,例如其www.google.co.il)包含不需要的字符,例如那些问号: 而不是希伯来语或阿拉伯语中的单词(英语工作得很好。
我正在使用此代码处理数据:
c = httplib.HTTPSConnection(webserver)
while 1:
c.request("GET", "/")
response = c.getresponse()
# send request to web server
# Indiscriminately forward bytes
data = response.read() # NEED TO DECODE
print "DATA : ", data
if len(data) > 0:
conn.send(data)
print "DATA SENT!"
else:
break
c.close()
conn.close()
这是我收到的数据(我不能在此处包含所有内容,因此这是包含数据html预览的照片):The data
我遇到的最后一个问题是数据没有发送到浏览器。代理接收数据(正如您在第二个问题中看到的那样),但由于某种原因,它不会将数据转发到浏览器。 (代码与第二个问题相同)。
浏览器显示此错误:ERR_TUNNEL_CONNECTION_FAILED
非常感谢任何帮助!
提前致谢,Yahli
*编辑:仍然找不到答案。我需要你的帮助:)
答案 0 :(得分:1)
你从套接字中读到的是原始字节。我认为你需要先通过str.decode()
将它们放入UTF-8中,如下所示:
data = response.read().decode('utf8')
请注意,内容并非始终以UTF-8编码。必须单独检查每个响应的Content-Type
HTTP标头。
关于您的浏览器问题:我怀疑您忘记将适当的HTTP标头发送到客户端。或者,实际上,任何类型的标题部分。