2012-01-18 106 views
0

如何获取对HTTPS请求的完全未解析响应?获取对HTTPS GET请求的原始未解析响应

是否有任何HTTP库会允许您获取原始响应,或者是使用套接字手动构建请求的唯一方法?

我特别想看看服务器发送了什么换行符。

+0

[用套接字创建原始HTTP请求]的可能的重复(http://stackoverflow.com/questions/5755507/creating-a-raw-http-request-with-sockets) – katrielalex 2012-01-18 23:36:55

回答

1

Example from the docs

import socket, ssl, pprint 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# require a certificate from the server 
ssl_sock = ssl.wrap_socket(s, 
          # http://curl.haxx.se/ca/cacert.pem 
          ca_certs="cacert.pem", 
          cert_reqs=ssl.CERT_REQUIRED) 

ssl_sock.connect(('www.verisign.com', 443)) 

print repr(ssl_sock.getpeername()) 
print ssl_sock.cipher() 
print pprint.pformat(ssl_sock.getpeercert()) 

# Set a simple HTTP request -- use httplib in actual code. 
ssl_sock.write("""GET/HTTP/1.0\r 
Host: www.verisign.com\r\n\r\n""") 

# Read a chunk of data. Will not necessarily 
# read all the data returned by the server. 
data = ssl_sock.read() 
print repr(data)[:79] 

# note that closing the SSLSocket will also close the underlying socket 
ssl_sock.close() 

输出

(ip, 443) 
('DHE-RSA-AES256-SHA', 'TLSv1/SSLv3', 256) 
{'notAfter': 'May 25 23:59:59 2012 GMT', 
'subject': ((('1.3.6.1.4.1.311.60.2.1.3', u'US'),), 
      (('1.3.6.1.4.1.311.60.2.1.2', u'Delaware'),), 
      (('businessCategory', u'V1.0, Clause 5.(b)'),), 
      (('serialNumber', u'2497886'),), 
      (('countryName', u'US'),), 
      (('postalCode', u'94043'),), 
      (('stateOrProvinceName', u'California'),), 
      (('localityName', u'Mountain View'),), 
      (('streetAddress', u'487 East Middlefield Road'),), 
      (('organizationName', u'VeriSign, Inc.'),), 
      (('organizationalUnitName', u' Production Security Services'),), 
      (('commonName', u'www.verisign.com'),))} 
'HTTP/1.1 200 OK\r\nDate: Thu, 19 Jan 2012 01:47:31 GMT\r\nServer: Apache\r\nSe 

Example with M2Crypto

+0

@Acorn:代码有效。我已经用[cacert.pem](http://curl.haxx.se/ca/cacert.pem)对它进行了测试。 – jfs 2012-01-19 01:43:59

+0

@Acorn:我已将示例输出添加到答案中。 – jfs 2012-01-19 01:57:03

0

这取决于你将要对结果做什么。 httplib.HTTPSConnectionset_debuglevel方法,它允许将响应数据打印到stdout(虽然每行都有前缀)。出于调试的目的,这正是我所需要的。不知道,这是你需要的。