使用OpenSSL下载页面发送 - Python

问题描述:

我正在使用pyOpenSSL库建立连接。 下面是如何创建的连接:使用OpenSSL下载页面发送 - Python

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.settimeout(5) 
self.context = OpenSSL.SSL.Context(OpenSSL.SSL.TLSv1_2_METHOD) 
self.connection = OpenSSL.SSL.Connection(context, s) 
self.connection.connect((url, SSL_PORT)) 

很琐碎。现在,我想送一个GET请求一个URL,并下载其页面:

def send(self, url): 
    if not self.connection: 
     log.warning("Connection not stablished") 
     return None 
    else: 
     request = "GET/HTTP/1.1 Host: www.google.com" 
     self.connection.send(request) 
     log.info("Server response") 
     log.info("-" * 40) 
     resp = self.connection.recv(4096) 
     while (len(resp) > 0): 
      log.info(resp) 
      resp = self.connection.recv(4096) 
     return resp 

但是我得到一个HTTP/1.1 408 REQUEST_TIMEOUT

File "./scurl", line 125, in send 
    log.info(resp) 
    File "/usr/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1320, in recv 
    self._raise_ssl_error(self._ssl, result) 
    File "/usr/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1167, in _raise_ssl_error 
    raise ZeroReturnError() 
OpenSSL.SSL.ZeroReturnError 

什么是下载网页内容的正确方法是什么?

***规则:****我不能使用其他库。是的,这是一个功课。我只是在request有问题。有人能给我一个线索吗?

首先,HTTP GET请求看起来无效。它应该是:

 
GET/HTTP/1.1\r\n 
Host: www.google.com\r\n\r\n 

注意回车('\r')和新线('\n')在每行的结束字符。您可以存储此像这样的字符串:

request = "GET/HTTP/1.1\r\nHost: www.google.com\r\n\r\n" 

因为请求没有正确终止,远程服务器将等待请求的其余部分,并最终以HTTP 408响应超时。


另一个问题可能是您可能从不同的连接读取。您发送使用实例成员self.connection

self.connection.send(request) 

但要尽量读什么似乎是一个全局变量的响应:

resp = connection.recv(4096) 
+0

即使我说的要求,你所提到的,我一直读到缓冲区中没有任何东西,我仍然收到“OpenSSL.SSL.ZeroReturnError” – cybertextron

+0

@philippe:另一个潜在的问题 - 请参阅更新的答案。 – mhawke

+0

我更新了我的帖子。请看一下。 – cybertextron