如何在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的区别

通过代理通过 python 连接到 Dropbox

为啥我在 python 中收到此错误? (httplib)

Python + Splinter:错误 - httplib.BadStatusLine:''

云备份项目