Skip to content

Commit 496e06a

Browse files
committed
Merge pull request #806 from geekerzp/develop_2.0_python_https
[Python] Verified HTTPS with SSL/TLS cert.
2 parents 513bd17 + 18cf6bc commit 496e06a

File tree

4 files changed

+74
-32
lines changed

4 files changed

+74
-32
lines changed

modules/swagger-codegen/src/main/resources/python/rest.mustache

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import sys
33
import io
44
import json
5+
import ssl
6+
import certifi
57

68
# python 2 and python 3 compatibility library
79
from six import iteritems
@@ -42,10 +44,30 @@ class RESTResponse(io.IOBase):
4244
class RESTClientObject(object):
4345

4446
def __init__(self, pools_size=4):
47+
# http pool manager
4548
self.pool_manager = urllib3.PoolManager(
4649
num_pools=pools_size
4750
)
4851

52+
# https pool manager
53+
# certificates validated using Mozilla’s root certificates
54+
self.ssl_pool_manager = urllib3.PoolManager(
55+
num_pools=pools_size,
56+
cert_reqs=ssl.CERT_REQUIRED,
57+
ca_certs=certifi.where()
58+
)
59+
60+
def agent(self, url):
61+
"""
62+
Return proper pool manager for the http\https schemes.
63+
"""
64+
url = urllib3.util.url.parse_url(url)
65+
scheme = url.scheme
66+
if scheme == 'https':
67+
return self.ssl_pool_manager
68+
else:
69+
return self.pool_manager
70+
4971
def request(self, method, url, query_params=None, headers=None,
5072
body=None, post_params=None):
5173
"""
@@ -56,7 +78,6 @@ class RESTClientObject(object):
5678
:param body: request json body, for `application/json`
5779
:param post_params: request post parameters, `application/x-www-form-urlencode`
5880
and `multipart/form-data`
59-
:param raw_response: if return the raw response
6081
"""
6182
method = method.upper()
6283
assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', 'PATCH']
@@ -75,27 +96,27 @@ class RESTClientObject(object):
7596
if query_params:
7697
url += '?' + urlencode(query_params)
7798
if headers['Content-Type'] == 'application/json':
78-
r = self.pool_manager.request(method, url,
79-
body=json.dumps(body),
80-
headers=headers)
99+
r = self.agent(url).request(method, url,
100+
body=json.dumps(body),
101+
headers=headers)
81102
if headers['Content-Type'] == 'application/x-www-form-urlencoded':
82-
r = self.pool_manager.request(method, url,
83-
fields=post_params,
84-
encode_multipart=False,
85-
headers=headers)
103+
r = self.agent(url).request(method, url,
104+
fields=post_params,
105+
encode_multipart=False,
106+
headers=headers)
86107
if headers['Content-Type'] == 'multipart/form-data':
87108
# must del headers['Content-Type'], or the correct Content-Type
88109
# which generated by urllib3 will be overwritten.
89110
del headers['Content-Type']
90-
r = self.pool_manager.request(method, url,
91-
fields=post_params,
92-
encode_multipart=True,
93-
headers=headers)
111+
r = self.agent(url).request(method, url,
112+
fields=post_params,
113+
encode_multipart=True,
114+
headers=headers)
94115
# For `GET`, `HEAD`, `DELETE`
95116
else:
96-
r = self.pool_manager.request(method, url,
97-
fields=query_params,
98-
headers=headers)
117+
r = self.agent(url).request(method, url,
118+
fields=query_params,
119+
headers=headers)
99120
r = RESTResponse(r)
100121

101122
if r.status not in range(200, 206):

modules/swagger-codegen/src/main/resources/python/setup.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ from setuptools import setup, find_packages
1212
# Try reading the setuptools documentation:
1313
# http://pypi.python.org/pypi/setuptools
1414

15-
REQUIRES = ["urllib3 >= 1.10", "six >= 1.9"]
15+
REQUIRES = ["urllib3 >= 1.10", "six >= 1.9", "certifi"]
1616

1717
setup(
1818
name="{{module}}",

samples/client/petstore/python/SwaggerPetstore-python/SwaggerPetstore/rest.py

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import sys
33
import io
44
import json
5+
import ssl
6+
import certifi
57

68
# python 2 and python 3 compatibility library
79
from six import iteritems
@@ -42,10 +44,30 @@ def getheader(self, name, default=None):
4244
class RESTClientObject(object):
4345

4446
def __init__(self, pools_size=4):
47+
# http pool manager
4548
self.pool_manager = urllib3.PoolManager(
4649
num_pools=pools_size
4750
)
4851

52+
# https pool manager
53+
# certificates validated using Mozilla’s root certificates
54+
self.ssl_pool_manager = urllib3.PoolManager(
55+
num_pools=pools_size,
56+
cert_reqs=ssl.CERT_REQUIRED,
57+
ca_certs=certifi.where()
58+
)
59+
60+
def agent(self, url):
61+
"""
62+
Return proper pool manager for the http\https schemes.
63+
"""
64+
url = urllib3.util.url.parse_url(url)
65+
scheme = url.scheme
66+
if scheme == 'https':
67+
return self.ssl_pool_manager
68+
else:
69+
return self.pool_manager
70+
4971
def request(self, method, url, query_params=None, headers=None,
5072
body=None, post_params=None):
5173
"""
@@ -56,7 +78,6 @@ def request(self, method, url, query_params=None, headers=None,
5678
:param body: request json body, for `application/json`
5779
:param post_params: request post parameters, `application/x-www-form-urlencode`
5880
and `multipart/form-data`
59-
:param raw_response: if return the raw response
6081
"""
6182
method = method.upper()
6283
assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', 'PATCH']
@@ -75,27 +96,27 @@ def request(self, method, url, query_params=None, headers=None,
7596
if query_params:
7697
url += '?' + urlencode(query_params)
7798
if headers['Content-Type'] == 'application/json':
78-
r = self.pool_manager.request(method, url,
79-
body=json.dumps(body),
80-
headers=headers)
99+
r = self.agent(url).request(method, url,
100+
body=json.dumps(body),
101+
headers=headers)
81102
if headers['Content-Type'] == 'application/x-www-form-urlencoded':
82-
r = self.pool_manager.request(method, url,
83-
fields=post_params,
84-
encode_multipart=False,
85-
headers=headers)
103+
r = self.agent(url).request(method, url,
104+
fields=post_params,
105+
encode_multipart=False,
106+
headers=headers)
86107
if headers['Content-Type'] == 'multipart/form-data':
87108
# must del headers['Content-Type'], or the correct Content-Type
88109
# which generated by urllib3 will be overwritten.
89110
del headers['Content-Type']
90-
r = self.pool_manager.request(method, url,
91-
fields=post_params,
92-
encode_multipart=True,
93-
headers=headers)
111+
r = self.agent(url).request(method, url,
112+
fields=post_params,
113+
encode_multipart=True,
114+
headers=headers)
94115
# For `GET`, `HEAD`, `DELETE`
95116
else:
96-
r = self.pool_manager.request(method, url,
97-
fields=query_params,
98-
headers=headers)
117+
r = self.agent(url).request(method, url,
118+
fields=query_params,
119+
headers=headers)
99120
r = RESTResponse(r)
100121

101122
if r.status not in range(200, 206):

samples/client/petstore/python/SwaggerPetstore-python/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# Try reading the setuptools documentation:
1313
# http://pypi.python.org/pypi/setuptools
1414

15-
REQUIRES = ["urllib3 >= 1.10", "six >= 1.9"]
15+
REQUIRES = ["urllib3 >= 1.10", "six >= 1.9", "certifi"]
1616

1717
setup(
1818
name="SwaggerPetstore",

0 commit comments

Comments
 (0)