使用 OpenSSL 发送下载页面 - Python
Downloading a page using OpenSSL send - Python
我正在使用 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))
非常琐碎。现在我想向 url 发送一个 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
时遇到了问题。有人可以给我线索吗?
一方面,HTTP GET 请求看起来无效。应该是:
GET / HTTP/1.1\r\n
Host: www.google.com\r\n\r\n
注意每行末尾的回车符 return ('\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)
我正在使用 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))
非常琐碎。现在我想向 url 发送一个 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
时遇到了问题。有人可以给我线索吗?
一方面,HTTP GET 请求看起来无效。应该是:
GET / HTTP/1.1\r\n Host: www.google.com\r\n\r\n
注意每行末尾的回车符 return ('\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)