Skip to content

Commit 2ca9586

Browse files
authored
Add socks5 proxy support for OpenAPI generated python client (#16918)
* add socks5 proxy support (requires additional import) * updated examples * build samples. updated to support pydantic python option * rename sock to socks for correct protocol name * add proxy headers for pydantic * fixed param changes from conflict resolution
1 parent 2c25443 commit 2ca9586

File tree

7 files changed

+237
-69
lines changed
  • modules/openapi-generator/src/main/resources
  • samples
    • client/echo_api
      • python/openapi_client
      • python-disallowAdditionalPropertiesIfNotPresent-true/openapi_client
      • python-pydantic-v1/openapi_client
    • openapi3/client/petstore

7 files changed

+237
-69
lines changed

modules/openapi-generator/src/main/resources/python-pydantic-v1/rest.mustache

+35-11
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ from {{packageName}}.exceptions import ApiException, UnauthorizedException, Forb
1616

1717
logger = logging.getLogger(__name__)
1818

19+
SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"}
20+
21+
22+
def is_socks_proxy_url(url):
23+
if url is None:
24+
return False
25+
split_section = url.split("://")
26+
if len(split_section) < 2:
27+
return False
28+
else:
29+
return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES
30+
1931

2032
class RESTResponse(io.IOBase):
2133

@@ -71,17 +83,29 @@ class RESTClientObject:
7183

7284
# https pool manager
7385
if configuration.proxy:
74-
self.pool_manager = urllib3.ProxyManager(
75-
num_pools=pools_size,
76-
maxsize=maxsize,
77-
cert_reqs=cert_reqs,
78-
ca_certs=configuration.ssl_ca_cert,
79-
cert_file=configuration.cert_file,
80-
key_file=configuration.key_file,
81-
proxy_url=configuration.proxy,
82-
proxy_headers=configuration.proxy_headers,
83-
**addition_pool_args
84-
)
86+
if is_socks_proxy_url(configuration.proxy):
87+
from urllib3.contrib.socks import SOCKSProxyManager
88+
self.pool_manager = SOCKSProxyManager(
89+
cert_reqs=cert_reqs,
90+
ca_certs=configuration.ssl_ca_cert,
91+
cert_file=configuration.cert_file,
92+
key_file=configuration.key_file,
93+
proxy_url=configuration.proxy,
94+
headers=configuration.proxy_headers,
95+
**addition_pool_args
96+
)
97+
else:
98+
self.pool_manager = urllib3.ProxyManager(
99+
num_pools=pools_size,
100+
maxsize=maxsize,
101+
cert_reqs=cert_reqs,
102+
ca_certs=configuration.ssl_ca_cert,
103+
cert_file=configuration.cert_file,
104+
key_file=configuration.key_file,
105+
proxy_url=configuration.proxy,
106+
proxy_headers=configuration.proxy_headers,
107+
**addition_pool_args
108+
)
85109
else:
86110
self.pool_manager = urllib3.PoolManager(
87111
num_pools=pools_size,

modules/openapi-generator/src/main/resources/python/rest.mustache

+33-9
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,20 @@ import urllib3
1111

1212
from {{packageName}}.exceptions import ApiException, ApiValueError
1313

14+
SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"}
1415
RESTResponseType = urllib3.HTTPResponse
1516

17+
18+
def is_socks_proxy_url(url):
19+
if url is None:
20+
return False
21+
split_section = url.split("://")
22+
if len(split_section) < 2:
23+
return False
24+
else:
25+
return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES
26+
27+
1628
class RESTResponse(io.IOBase):
1729

1830
def __init__(self, resp) -> None:
@@ -67,15 +79,27 @@ class RESTClientObject:
6779

6880
# https pool manager
6981
if configuration.proxy:
70-
self.pool_manager = urllib3.ProxyManager(
71-
cert_reqs=cert_reqs,
72-
ca_certs=configuration.ssl_ca_cert,
73-
cert_file=configuration.cert_file,
74-
key_file=configuration.key_file,
75-
proxy_url=configuration.proxy,
76-
proxy_headers=configuration.proxy_headers,
77-
**addition_pool_args
78-
)
82+
if is_socks_proxy_url(configuration.proxy):
83+
from urllib3.contrib.socks import SOCKSProxyManager
84+
self.pool_manager = SOCKSProxyManager(
85+
cert_reqs=cert_reqs,
86+
ca_certs=configuration.ssl_ca_cert,
87+
cert_file=configuration.cert_file,
88+
key_file=configuration.key_file,
89+
proxy_url=configuration.proxy,
90+
headers=configuration.proxy_headers,
91+
**addition_pool_args
92+
)
93+
else:
94+
self.pool_manager = urllib3.ProxyManager(
95+
cert_reqs=cert_reqs,
96+
ca_certs=configuration.ssl_ca_cert,
97+
cert_file=configuration.cert_file,
98+
key_file=configuration.key_file,
99+
proxy_url=configuration.proxy,
100+
proxy_headers=configuration.proxy_headers,
101+
**addition_pool_args
102+
)
79103
else:
80104
self.pool_manager = urllib3.PoolManager(
81105
cert_reqs=cert_reqs,

samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent-true/openapi_client/rest.py

+33-9
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,20 @@
2222

2323
from openapi_client.exceptions import ApiException, ApiValueError
2424

25+
SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"}
2526
RESTResponseType = urllib3.HTTPResponse
2627

28+
29+
def is_socks_proxy_url(url):
30+
if url is None:
31+
return False
32+
split_section = url.split("://")
33+
if len(split_section) < 2:
34+
return False
35+
else:
36+
return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES
37+
38+
2739
class RESTResponse(io.IOBase):
2840

2941
def __init__(self, resp) -> None:
@@ -78,15 +90,27 @@ def __init__(self, configuration) -> None:
7890

7991
# https pool manager
8092
if configuration.proxy:
81-
self.pool_manager = urllib3.ProxyManager(
82-
cert_reqs=cert_reqs,
83-
ca_certs=configuration.ssl_ca_cert,
84-
cert_file=configuration.cert_file,
85-
key_file=configuration.key_file,
86-
proxy_url=configuration.proxy,
87-
proxy_headers=configuration.proxy_headers,
88-
**addition_pool_args
89-
)
93+
if is_socks_proxy_url(configuration.proxy):
94+
from urllib3.contrib.socks import SOCKSProxyManager
95+
self.pool_manager = SOCKSProxyManager(
96+
cert_reqs=cert_reqs,
97+
ca_certs=configuration.ssl_ca_cert,
98+
cert_file=configuration.cert_file,
99+
key_file=configuration.key_file,
100+
proxy_url=configuration.proxy,
101+
headers=configuration.proxy_headers,
102+
**addition_pool_args
103+
)
104+
else:
105+
self.pool_manager = urllib3.ProxyManager(
106+
cert_reqs=cert_reqs,
107+
ca_certs=configuration.ssl_ca_cert,
108+
cert_file=configuration.cert_file,
109+
key_file=configuration.key_file,
110+
proxy_url=configuration.proxy,
111+
proxy_headers=configuration.proxy_headers,
112+
**addition_pool_args
113+
)
90114
else:
91115
self.pool_manager = urllib3.PoolManager(
92116
cert_reqs=cert_reqs,

samples/client/echo_api/python-pydantic-v1/openapi_client/rest.py

+35-11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@
2727

2828
logger = logging.getLogger(__name__)
2929

30+
SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"}
31+
32+
33+
def is_socks_proxy_url(url):
34+
if url is None:
35+
return False
36+
split_section = url.split("://")
37+
if len(split_section) < 2:
38+
return False
39+
else:
40+
return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES
41+
3042

3143
class RESTResponse(io.IOBase):
3244

@@ -82,17 +94,29 @@ def __init__(self, configuration, pools_size=4, maxsize=None) -> None:
8294

8395
# https pool manager
8496
if configuration.proxy:
85-
self.pool_manager = urllib3.ProxyManager(
86-
num_pools=pools_size,
87-
maxsize=maxsize,
88-
cert_reqs=cert_reqs,
89-
ca_certs=configuration.ssl_ca_cert,
90-
cert_file=configuration.cert_file,
91-
key_file=configuration.key_file,
92-
proxy_url=configuration.proxy,
93-
proxy_headers=configuration.proxy_headers,
94-
**addition_pool_args
95-
)
97+
if is_socks_proxy_url(configuration.proxy):
98+
from urllib3.contrib.socks import SOCKSProxyManager
99+
self.pool_manager = SOCKSProxyManager(
100+
cert_reqs=cert_reqs,
101+
ca_certs=configuration.ssl_ca_cert,
102+
cert_file=configuration.cert_file,
103+
key_file=configuration.key_file,
104+
proxy_url=configuration.proxy,
105+
headers=configuration.proxy_headers,
106+
**addition_pool_args
107+
)
108+
else:
109+
self.pool_manager = urllib3.ProxyManager(
110+
num_pools=pools_size,
111+
maxsize=maxsize,
112+
cert_reqs=cert_reqs,
113+
ca_certs=configuration.ssl_ca_cert,
114+
cert_file=configuration.cert_file,
115+
key_file=configuration.key_file,
116+
proxy_url=configuration.proxy,
117+
proxy_headers=configuration.proxy_headers,
118+
**addition_pool_args
119+
)
96120
else:
97121
self.pool_manager = urllib3.PoolManager(
98122
num_pools=pools_size,

samples/client/echo_api/python/openapi_client/rest.py

+33-9
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,20 @@
2222

2323
from openapi_client.exceptions import ApiException, ApiValueError
2424

25+
SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"}
2526
RESTResponseType = urllib3.HTTPResponse
2627

28+
29+
def is_socks_proxy_url(url):
30+
if url is None:
31+
return False
32+
split_section = url.split("://")
33+
if len(split_section) < 2:
34+
return False
35+
else:
36+
return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES
37+
38+
2739
class RESTResponse(io.IOBase):
2840

2941
def __init__(self, resp) -> None:
@@ -78,15 +90,27 @@ def __init__(self, configuration) -> None:
7890

7991
# https pool manager
8092
if configuration.proxy:
81-
self.pool_manager = urllib3.ProxyManager(
82-
cert_reqs=cert_reqs,
83-
ca_certs=configuration.ssl_ca_cert,
84-
cert_file=configuration.cert_file,
85-
key_file=configuration.key_file,
86-
proxy_url=configuration.proxy,
87-
proxy_headers=configuration.proxy_headers,
88-
**addition_pool_args
89-
)
93+
if is_socks_proxy_url(configuration.proxy):
94+
from urllib3.contrib.socks import SOCKSProxyManager
95+
self.pool_manager = SOCKSProxyManager(
96+
cert_reqs=cert_reqs,
97+
ca_certs=configuration.ssl_ca_cert,
98+
cert_file=configuration.cert_file,
99+
key_file=configuration.key_file,
100+
proxy_url=configuration.proxy,
101+
headers=configuration.proxy_headers,
102+
**addition_pool_args
103+
)
104+
else:
105+
self.pool_manager = urllib3.ProxyManager(
106+
cert_reqs=cert_reqs,
107+
ca_certs=configuration.ssl_ca_cert,
108+
cert_file=configuration.cert_file,
109+
key_file=configuration.key_file,
110+
proxy_url=configuration.proxy,
111+
proxy_headers=configuration.proxy_headers,
112+
**addition_pool_args
113+
)
90114
else:
91115
self.pool_manager = urllib3.PoolManager(
92116
cert_reqs=cert_reqs,

samples/openapi3/client/petstore/python-pydantic-v1/petstore_api/rest.py

+35-11
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@
2626

2727
logger = logging.getLogger(__name__)
2828

29+
SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"}
30+
31+
32+
def is_socks_proxy_url(url):
33+
if url is None:
34+
return False
35+
split_section = url.split("://")
36+
if len(split_section) < 2:
37+
return False
38+
else:
39+
return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES
40+
2941

3042
class RESTResponse(io.IOBase):
3143

@@ -81,17 +93,29 @@ def __init__(self, configuration, pools_size=4, maxsize=None) -> None:
8193

8294
# https pool manager
8395
if configuration.proxy:
84-
self.pool_manager = urllib3.ProxyManager(
85-
num_pools=pools_size,
86-
maxsize=maxsize,
87-
cert_reqs=cert_reqs,
88-
ca_certs=configuration.ssl_ca_cert,
89-
cert_file=configuration.cert_file,
90-
key_file=configuration.key_file,
91-
proxy_url=configuration.proxy,
92-
proxy_headers=configuration.proxy_headers,
93-
**addition_pool_args
94-
)
96+
if is_socks_proxy_url(configuration.proxy):
97+
from urllib3.contrib.socks import SOCKSProxyManager
98+
self.pool_manager = SOCKSProxyManager(
99+
cert_reqs=cert_reqs,
100+
ca_certs=configuration.ssl_ca_cert,
101+
cert_file=configuration.cert_file,
102+
key_file=configuration.key_file,
103+
proxy_url=configuration.proxy,
104+
headers=configuration.proxy_headers,
105+
**addition_pool_args
106+
)
107+
else:
108+
self.pool_manager = urllib3.ProxyManager(
109+
num_pools=pools_size,
110+
maxsize=maxsize,
111+
cert_reqs=cert_reqs,
112+
ca_certs=configuration.ssl_ca_cert,
113+
cert_file=configuration.cert_file,
114+
key_file=configuration.key_file,
115+
proxy_url=configuration.proxy,
116+
proxy_headers=configuration.proxy_headers,
117+
**addition_pool_args
118+
)
95119
else:
96120
self.pool_manager = urllib3.PoolManager(
97121
num_pools=pools_size,

0 commit comments

Comments
 (0)