1
1
import time
2
2
import six
3
3
import os
4
+ import ssl
5
+
4
6
from six .moves import http_client
5
7
from six .moves .urllib .parse import urlparse
6
- from ssl import SSLError
7
8
8
9
9
10
class Stream :
10
- def __init__ (self , server , port = 80 , headers = {}, url = '/' , ssl_enabled = False ):
11
+ def __init__ (self , server , port = 80 , headers = {}, url = '/' , ssl_enabled = False ,
12
+ ssl_verification_enabled = True ):
11
13
''' Initialize a stream object and an HTTP or HTTPS connection
12
14
with chunked Transfer-Encoding to server:port with optional headers.
13
15
'''
@@ -20,6 +22,7 @@ def __init__(self, server, port=80, headers={}, url='/', ssl_enabled=False):
20
22
self ._headers = headers
21
23
self ._url = url
22
24
self ._ssl_enabled = ssl_enabled
25
+ self ._ssl_verification_enabled = ssl_verification_enabled
23
26
self ._connect ()
24
27
25
28
def write (self , data , reconnect_on = ('' , 200 , )):
@@ -99,6 +102,19 @@ def _get_proxy_config(self):
99
102
100
103
return proxy_server , proxy_port
101
104
105
+ def _get_ssl_context (self ):
106
+ """
107
+ Return an unverified context if ssl verification is disabled.
108
+
109
+ """
110
+
111
+ context = None
112
+
113
+ if not self ._ssl_verification_enabled :
114
+ context = ssl ._create_unverified_context ()
115
+
116
+ return context
117
+
102
118
def _connect (self ):
103
119
''' Initialize an HTTP/HTTPS connection with chunked Transfer-Encoding
104
120
to server:port with optional headers.
@@ -111,8 +127,9 @@ def _connect(self):
111
127
112
128
if (proxy_server and proxy_port ):
113
129
if ssl_enabled :
130
+ context = self ._get_ssl_context ()
114
131
self ._conn = http_client .HTTPSConnection (
115
- proxy_server , proxy_port
132
+ proxy_server , proxy_port , context = context
116
133
)
117
134
else :
118
135
self ._conn = http_client .HTTPConnection (
@@ -121,7 +138,10 @@ def _connect(self):
121
138
self ._conn .set_tunnel (server , port )
122
139
else :
123
140
if ssl_enabled :
124
- self ._conn = http_client .HTTPSConnection (server , port )
141
+ context = self ._get_ssl_context ()
142
+ self ._conn = http_client .HTTPSConnection (
143
+ server , port , context = context
144
+ )
125
145
else :
126
146
self ._conn = http_client .HTTPConnection (server , port )
127
147
@@ -254,7 +274,7 @@ def _isconnected(self):
254
274
# let's just assume that we're still connected and
255
275
# hopefully recieve some data on the next try.
256
276
return True
257
- elif isinstance (e , SSLError ):
277
+ elif isinstance (e , ssl . SSLError ):
258
278
if e .errno == 2 :
259
279
# errno 2 occurs when trying to read or write data, but more
260
280
# data needs to be received on the underlying TCP transport
0 commit comments