Skip to content

Commit be0cdee

Browse files
committed
[v3] Apply #822 changes to v3 branch
1 parent 74f14a7 commit be0cdee

File tree

5 files changed

+80
-40
lines changed

5 files changed

+80
-40
lines changed

slack/web/base_client.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import json
99
import logging
1010
import mimetypes
11-
import re
11+
import urllib
1212
import uuid
1313
import warnings
1414
from http.client import HTTPResponse
@@ -17,7 +17,7 @@
1717
from typing import Optional, Union
1818
from urllib.error import HTTPError
1919
from urllib.parse import urlencode
20-
from urllib.request import Request, urlopen
20+
from urllib.request import Request, urlopen, OpenerDirector, ProxyHandler, HTTPSHandler
2121

2222
import aiohttp
2323
from aiohttp import FormData, BasicAuth
@@ -455,20 +455,26 @@ def _perform_urllib_http_request(
455455
# (BAN-B310)
456456
if url.lower().startswith("http"):
457457
req = Request(method="POST", url=url, data=body, headers=headers)
458+
opener: Optional[OpenerDirector] = None
458459
if self.proxy is not None:
459460
if isinstance(self.proxy, str):
460-
host = re.sub("^https?://", "", self.proxy)
461-
req.set_proxy(host, "http")
462-
req.set_proxy(host, "https")
461+
opener = urllib.request.build_opener(
462+
ProxyHandler({"http": self.proxy, "https": self.proxy}),
463+
HTTPSHandler(context=self.ssl),
464+
)
463465
else:
464466
raise SlackRequestError(
465467
f"Invalid proxy detected: {self.proxy} must be a str value"
466468
)
467469

468470
# NOTE: BAN-B310 is already checked above
469-
resp: HTTPResponse = urlopen( # skipcq: BAN-B310
470-
req, context=self.ssl, timeout=self.timeout
471-
)
471+
resp: Optional[HTTPResponse] = None
472+
if opener:
473+
resp = opener.open(req, timeout=self.timeout) # skipcq: BAN-B310
474+
else:
475+
resp = urlopen( # skipcq: BAN-B310
476+
req, context=self.ssl, timeout=self.timeout
477+
)
472478
charset = resp.headers.get_content_charset()
473479
body: str = resp.read().decode(charset) # read the response body here
474480
return {"status": resp.code, "headers": resp.headers, "body": body}

slack/webhook/client.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import json
22
import logging
3-
import re
3+
import urllib
44
from http.client import HTTPResponse
55
from ssl import SSLContext
66
from typing import Dict, Union, List, Optional
77
from urllib.error import HTTPError
8-
from urllib.request import Request, urlopen
8+
from urllib.request import Request, urlopen, OpenerDirector, ProxyHandler, HTTPSHandler
99

1010
from slack.errors import SlackRequestError
1111
from .internal_utils import _build_body, _build_request_headers, _debug_log_response
@@ -97,22 +97,33 @@ def _perform_http_request(
9797
)
9898
try:
9999
url = self.url
100+
opener: Optional[OpenerDirector] = None
100101
# for security (BAN-B310)
101102
if url.lower().startswith("http"):
102103
req = Request(
103104
method="POST", url=url, data=body.encode("utf-8"), headers=headers
104105
)
105106
if self.proxy is not None:
106-
host = re.sub("^https?://", "", self.proxy)
107-
req.set_proxy(host, "http")
108-
req.set_proxy(host, "https")
107+
if isinstance(self.proxy, str):
108+
opener = urllib.request.build_opener(
109+
ProxyHandler({"http": self.proxy, "https": self.proxy}),
110+
HTTPSHandler(context=self.ssl),
111+
)
112+
else:
113+
raise SlackRequestError(
114+
f"Invalid proxy detected: {self.proxy} must be a str value"
115+
)
109116
else:
110117
raise SlackRequestError(f"Invalid URL detected: {url}")
111118

112119
# NOTE: BAN-B310 is already checked above
113-
resp: HTTPResponse = urlopen( # skipcq: BAN-B310
114-
req, context=self.ssl, timeout=self.timeout,
115-
)
120+
resp: Optional[HTTPResponse] = None
121+
if opener:
122+
resp = opener.open(req, timeout=self.timeout) # skipcq: BAN-B310
123+
else:
124+
resp = urlopen( # skipcq: BAN-B310
125+
req, context=self.ssl, timeout=self.timeout
126+
)
116127
charset: str = resp.headers.get_content_charset() or "utf-8"
117128
response_body: str = resp.read().decode(charset)
118129
resp = WebhookResponse(

slack_sdk/web/base_client.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import json
88
import logging
99
import mimetypes
10-
import re
10+
import urllib
1111
import uuid
1212
import warnings
1313
from base64 import b64encode
@@ -17,7 +17,7 @@
1717
from typing import Optional, Union
1818
from urllib.error import HTTPError
1919
from urllib.parse import urlencode
20-
from urllib.request import Request, urlopen
20+
from urllib.request import Request, urlopen, OpenerDirector, ProxyHandler, HTTPSHandler
2121

2222
import slack_sdk.errors as err
2323
from slack_sdk.errors import SlackRequestError
@@ -370,20 +370,26 @@ def _perform_urllib_http_request(
370370
# (BAN-B310)
371371
if url.lower().startswith("http"):
372372
req = Request(method="POST", url=url, data=body, headers=headers)
373+
opener: Optional[OpenerDirector] = None
373374
if self.proxy is not None:
374375
if isinstance(self.proxy, str):
375-
host = re.sub("^https?://", "", self.proxy)
376-
req.set_proxy(host, "http")
377-
req.set_proxy(host, "https")
376+
opener = urllib.request.build_opener(
377+
ProxyHandler({"http": self.proxy, "https": self.proxy}),
378+
HTTPSHandler(context=self.ssl),
379+
)
378380
else:
379381
raise SlackRequestError(
380382
f"Invalid proxy detected: {self.proxy} must be a str value"
381383
)
382384

383385
# NOTE: BAN-B310 is already checked above
384-
resp: HTTPResponse = urlopen( # skipcq: BAN-B310
385-
req, context=self.ssl, timeout=self.timeout
386-
)
386+
resp: Optional[HTTPResponse] = None
387+
if opener:
388+
resp = opener.open(req, timeout=self.timeout) # skipcq: BAN-B310
389+
else:
390+
resp = urlopen( # skipcq: BAN-B310
391+
req, context=self.ssl, timeout=self.timeout
392+
)
387393
charset = resp.headers.get_content_charset()
388394
body: str = resp.read().decode(charset) # read the response body here
389395
return {"status": resp.code, "headers": resp.headers, "body": body}

slack_sdk/web/legacy_base_client.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import json
99
import logging
1010
import mimetypes
11-
import re
11+
import urllib
1212
import uuid
1313
import warnings
1414
from http.client import HTTPResponse
@@ -17,7 +17,7 @@
1717
from typing import Optional, Union
1818
from urllib.error import HTTPError
1919
from urllib.parse import urlencode
20-
from urllib.request import Request, urlopen
20+
from urllib.request import Request, urlopen, OpenerDirector, ProxyHandler, HTTPSHandler
2121

2222
import aiohttp
2323
from aiohttp import FormData, BasicAuth
@@ -450,20 +450,26 @@ def _perform_urllib_http_request(
450450
# (BAN-B310)
451451
if url.lower().startswith("http"):
452452
req = Request(method="POST", url=url, data=body, headers=headers)
453+
opener: Optional[OpenerDirector] = None
453454
if self.proxy is not None:
454455
if isinstance(self.proxy, str):
455-
host = re.sub("^https?://", "", self.proxy)
456-
req.set_proxy(host, "http")
457-
req.set_proxy(host, "https")
456+
opener = urllib.request.build_opener(
457+
ProxyHandler({"http": self.proxy, "https": self.proxy}),
458+
HTTPSHandler(context=self.ssl),
459+
)
458460
else:
459461
raise SlackRequestError(
460462
f"Invalid proxy detected: {self.proxy} must be a str value"
461463
)
462464

463465
# NOTE: BAN-B310 is already checked above
464-
resp: HTTPResponse = urlopen( # skipcq: BAN-B310
465-
req, context=self.ssl, timeout=self.timeout
466-
)
466+
resp: Optional[HTTPResponse] = None
467+
if opener:
468+
resp = opener.open(req, timeout=self.timeout) # skipcq: BAN-B310
469+
else:
470+
resp = urlopen( # skipcq: BAN-B310
471+
req, context=self.ssl, timeout=self.timeout
472+
)
467473
charset = resp.headers.get_content_charset()
468474
body: str = resp.read().decode(charset) # read the response body here
469475
return {"status": resp.code, "headers": resp.headers, "body": body}

slack_sdk/webhook/client.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import json
22
import logging
3-
import re
3+
import urllib
44
from http.client import HTTPResponse
55
from ssl import SSLContext
66
from typing import Dict, Union, List, Optional
77
from urllib.error import HTTPError
8-
from urllib.request import Request, urlopen
8+
from urllib.request import Request, urlopen, OpenerDirector, ProxyHandler, HTTPSHandler
99

1010
from slack_sdk.errors import SlackRequestError
1111
from slack_sdk.models.attachments import Attachment
@@ -109,22 +109,33 @@ def _perform_http_request(
109109
)
110110
try:
111111
url = self.url
112+
opener: Optional[OpenerDirector] = None
112113
# for security (BAN-B310)
113114
if url.lower().startswith("http"):
114115
req = Request(
115116
method="POST", url=url, data=body.encode("utf-8"), headers=headers
116117
)
117118
if self.proxy is not None:
118-
host = re.sub("^https?://", "", self.proxy)
119-
req.set_proxy(host, "http")
120-
req.set_proxy(host, "https")
119+
if isinstance(self.proxy, str):
120+
opener = urllib.request.build_opener(
121+
ProxyHandler({"http": self.proxy, "https": self.proxy}),
122+
HTTPSHandler(context=self.ssl),
123+
)
124+
else:
125+
raise SlackRequestError(
126+
f"Invalid proxy detected: {self.proxy} must be a str value"
127+
)
121128
else:
122129
raise SlackRequestError(f"Invalid URL detected: {url}")
123130

124131
# NOTE: BAN-B310 is already checked above
125-
resp: HTTPResponse = urlopen( # skipcq: BAN-B310
126-
req, context=self.ssl, timeout=self.timeout,
127-
)
132+
resp: Optional[HTTPResponse] = None
133+
if opener:
134+
resp = opener.open(req, timeout=self.timeout) # skipcq: BAN-B310
135+
else:
136+
resp = urlopen( # skipcq: BAN-B310
137+
req, context=self.ssl, timeout=self.timeout
138+
)
128139
charset: str = resp.headers.get_content_charset() or "utf-8"
129140
response_body: str = resp.read().decode(charset)
130141
resp = WebhookResponse(

0 commit comments

Comments
 (0)