From 18cf6bcfa64e380f8a39d2d02a4970152f3aa08a Mon Sep 17 00:00:00 2001 From: geekerzp Date: Fri, 29 May 2015 15:09:19 +0800 Subject: [PATCH] Updated python client. Verified HTTPS with SSL/TLS. --- .../src/main/resources/python/rest.mustache | 51 +++++++++++++------ .../src/main/resources/python/setup.mustache | 2 +- .../SwaggerPetstore/rest.py | 51 +++++++++++++------ .../python/SwaggerPetstore-python/setup.py | 2 +- 4 files changed, 74 insertions(+), 32 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/python/rest.mustache b/modules/swagger-codegen/src/main/resources/python/rest.mustache index 06b817da757..da99abc2493 100644 --- a/modules/swagger-codegen/src/main/resources/python/rest.mustache +++ b/modules/swagger-codegen/src/main/resources/python/rest.mustache @@ -2,6 +2,8 @@ import sys import io import json +import ssl +import certifi # python 2 and python 3 compatibility library from six import iteritems @@ -42,10 +44,30 @@ class RESTResponse(io.IOBase): class RESTClientObject(object): def __init__(self, pools_size=4): + # http pool manager self.pool_manager = urllib3.PoolManager( num_pools=pools_size ) + # https pool manager + # certificates validated using Mozilla’s root certificates + self.ssl_pool_manager = urllib3.PoolManager( + num_pools=pools_size, + cert_reqs=ssl.CERT_REQUIRED, + ca_certs=certifi.where() + ) + + def agent(self, url): + """ + Return proper pool manager for the http\https schemes. + """ + url = urllib3.util.url.parse_url(url) + scheme = url.scheme + if scheme == 'https': + return self.ssl_pool_manager + else: + return self.pool_manager + def request(self, method, url, query_params=None, headers=None, body=None, post_params=None): """ @@ -56,7 +78,6 @@ class RESTClientObject(object): :param body: request json body, for `application/json` :param post_params: request post parameters, `application/x-www-form-urlencode` and `multipart/form-data` - :param raw_response: if return the raw response """ method = method.upper() assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', 'PATCH'] @@ -75,27 +96,27 @@ class RESTClientObject(object): if query_params: url += '?' + urlencode(query_params) if headers['Content-Type'] == 'application/json': - r = self.pool_manager.request(method, url, - body=json.dumps(body), - headers=headers) + r = self.agent(url).request(method, url, + body=json.dumps(body), + headers=headers) if headers['Content-Type'] == 'application/x-www-form-urlencoded': - r = self.pool_manager.request(method, url, - fields=post_params, - encode_multipart=False, - headers=headers) + r = self.agent(url).request(method, url, + fields=post_params, + encode_multipart=False, + headers=headers) if headers['Content-Type'] == 'multipart/form-data': # must del headers['Content-Type'], or the correct Content-Type # which generated by urllib3 will be overwritten. del headers['Content-Type'] - r = self.pool_manager.request(method, url, - fields=post_params, - encode_multipart=True, - headers=headers) + r = self.agent(url).request(method, url, + fields=post_params, + encode_multipart=True, + headers=headers) # For `GET`, `HEAD`, `DELETE` else: - r = self.pool_manager.request(method, url, - fields=query_params, - headers=headers) + r = self.agent(url).request(method, url, + fields=query_params, + headers=headers) r = RESTResponse(r) if r.status not in range(200, 206): diff --git a/modules/swagger-codegen/src/main/resources/python/setup.mustache b/modules/swagger-codegen/src/main/resources/python/setup.mustache index a049057c920..f1ba52d2930 100644 --- a/modules/swagger-codegen/src/main/resources/python/setup.mustache +++ b/modules/swagger-codegen/src/main/resources/python/setup.mustache @@ -12,7 +12,7 @@ from setuptools import setup, find_packages # Try reading the setuptools documentation: # http://pypi.python.org/pypi/setuptools -REQUIRES = ["urllib3 >= 1.10", "six >= 1.9"] +REQUIRES = ["urllib3 >= 1.10", "six >= 1.9", "certifi"] setup( name="{{module}}", diff --git a/samples/client/petstore/python/SwaggerPetstore-python/SwaggerPetstore/rest.py b/samples/client/petstore/python/SwaggerPetstore-python/SwaggerPetstore/rest.py index 06b817da757..da99abc2493 100644 --- a/samples/client/petstore/python/SwaggerPetstore-python/SwaggerPetstore/rest.py +++ b/samples/client/petstore/python/SwaggerPetstore-python/SwaggerPetstore/rest.py @@ -2,6 +2,8 @@ import sys import io import json +import ssl +import certifi # python 2 and python 3 compatibility library from six import iteritems @@ -42,10 +44,30 @@ class RESTResponse(io.IOBase): class RESTClientObject(object): def __init__(self, pools_size=4): + # http pool manager self.pool_manager = urllib3.PoolManager( num_pools=pools_size ) + # https pool manager + # certificates validated using Mozilla’s root certificates + self.ssl_pool_manager = urllib3.PoolManager( + num_pools=pools_size, + cert_reqs=ssl.CERT_REQUIRED, + ca_certs=certifi.where() + ) + + def agent(self, url): + """ + Return proper pool manager for the http\https schemes. + """ + url = urllib3.util.url.parse_url(url) + scheme = url.scheme + if scheme == 'https': + return self.ssl_pool_manager + else: + return self.pool_manager + def request(self, method, url, query_params=None, headers=None, body=None, post_params=None): """ @@ -56,7 +78,6 @@ class RESTClientObject(object): :param body: request json body, for `application/json` :param post_params: request post parameters, `application/x-www-form-urlencode` and `multipart/form-data` - :param raw_response: if return the raw response """ method = method.upper() assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', 'PATCH'] @@ -75,27 +96,27 @@ class RESTClientObject(object): if query_params: url += '?' + urlencode(query_params) if headers['Content-Type'] == 'application/json': - r = self.pool_manager.request(method, url, - body=json.dumps(body), - headers=headers) + r = self.agent(url).request(method, url, + body=json.dumps(body), + headers=headers) if headers['Content-Type'] == 'application/x-www-form-urlencoded': - r = self.pool_manager.request(method, url, - fields=post_params, - encode_multipart=False, - headers=headers) + r = self.agent(url).request(method, url, + fields=post_params, + encode_multipart=False, + headers=headers) if headers['Content-Type'] == 'multipart/form-data': # must del headers['Content-Type'], or the correct Content-Type # which generated by urllib3 will be overwritten. del headers['Content-Type'] - r = self.pool_manager.request(method, url, - fields=post_params, - encode_multipart=True, - headers=headers) + r = self.agent(url).request(method, url, + fields=post_params, + encode_multipart=True, + headers=headers) # For `GET`, `HEAD`, `DELETE` else: - r = self.pool_manager.request(method, url, - fields=query_params, - headers=headers) + r = self.agent(url).request(method, url, + fields=query_params, + headers=headers) r = RESTResponse(r) if r.status not in range(200, 206): diff --git a/samples/client/petstore/python/SwaggerPetstore-python/setup.py b/samples/client/petstore/python/SwaggerPetstore-python/setup.py index fd0b786efa3..50a6ffeb00c 100644 --- a/samples/client/petstore/python/SwaggerPetstore-python/setup.py +++ b/samples/client/petstore/python/SwaggerPetstore-python/setup.py @@ -12,7 +12,7 @@ from setuptools import setup, find_packages # Try reading the setuptools documentation: # http://pypi.python.org/pypi/setuptools -REQUIRES = ["urllib3 >= 1.10", "six >= 1.9"] +REQUIRES = ["urllib3 >= 1.10", "six >= 1.9", "certifi"] setup( name="SwaggerPetstore",