如何在python中序列化httplib SSL连接对象?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在python中序列化httplib SSL连接对象?相关的知识,希望对你有一定的参考价值。
我试图通过zmq套接字发送httplib连接对象,但我得到以下错误TypeError: can't pickle _ssl._SSLSocket objects
。
现在我认为情况就是这样,因为我现在只是在试验,但有没有人知道一个包装或序列化SSL对象的方法,以便我可以通过套接字将它发送到其他线程?
一个用例示例:
#Script 1
import zmq
ctx = zmq.Context()
GLOBAL_SOCKET=ctx.socket(zmq.PUB)
GLOBAL_SOCKET.bind('tcp://127.0.0.1:2000')
conn = httplib.HTTPSConnection('site...')
GLOBAL_SOCKET.send_pyobj(conn)
#script 2
import zmq
ctx = zmq.Context()
GLOBAL_SOCKET=ctx.socket(zmq.SUB)
GLOBAL_SOCKET.connect('tcp://127.0.0.1:2000')
GLOBAL_SOCKET.setsockopt(zmq.SUBSCRIBE, '')
#recv SSL object in response hopefully
conn_ = GLOBAL_SOCKET.recv_pyobj()
#work with the connection object in another thread
conn_.request('GET', ....)
conn_.request.getresponse()
欢迎任何帮助。
答案
使用multiprocessing.Queue
的工作示例:
import httplib
import ssl
import copy_reg
from multiprocessing.reduction import rebuild_socket, reduce_socket
from multiprocessing import Queue
import os
def save_sslcontext(obj):
return obj.__class__, (obj.protocol,)
copy_reg.pickle(ssl.SSLSocket, reduce_socket, rebuild_socket)
copy_reg.pickle(ssl.SSLContext, save_sslcontext)
def parent():
conn = httplib.HTTPSConnection('www.baidu.com')
conn.connect()
queue.put(conn)
os.wait()
def child():
conn = queue.get()
conn.request('GET', '/')
r = conn.getresponse()
print r.status
queue = Queue()
if 0 == os.fork():
child()
else:
parent()
以上是关于如何在python中序列化httplib SSL连接对象?的主要内容,如果未能解决你的问题,请参考以下文章
验证python 2.7(https)中任何给定URL的SSL加密
python中urllib, urllib2,urllib3, httplib,httplib2, request的区别