使用OpenSSL发送下载页面 - Python

时间:2016-02-27 04:02:30

标签: python sockets ssl get connection

我正在使用pyOpenSSL库建立连接。 这是我创建连接的方式:

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请求,并下载其网页:

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的问题。有人能给我一个线索吗?

1 个答案:

答案 0 :(得分:1)

首先,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)