@@ -28,7 +28,7 @@ class MockHandler(SimpleHTTPRequestHandler):
2828
2929 error_html_response_body = '<!DOCTYPE html>\n <html lang="en">\n <head>\n \t <meta charset="utf-8">\n \t <title>Server Error | Slack</title>\n \t <meta name="author" content="Slack">\n \t <style></style>\n </head>\n <body>\n \t <nav class="top persistent">\n \t \t <a href="https://status.slack.com/" class="logo" data-qa="logo"></a>\n \t </nav>\n \t <div id="page">\n \t \t <div id="page_contents">\n \t \t \t <h1>\n \t \t \t \t <svg width="30px" height="27px" viewBox="0 0 60 54" class="warning_icon"><path d="" fill="#D94827"/></svg>\n \t \t \t \t Server Error\n \t \t \t </h1>\n \t \t \t <div class="card">\n \t \t \t \t <p>It seems like there’s a problem connecting to our servers, and we’re investigating the issue.</p>\n \t \t \t \t <p>Please <a href="https://status.slack.com/">check our Status page for updates</a>.</p>\n \t \t \t </div>\n \t \t </div>\n \t </div>\n \t <script type="text/javascript">\n \t \t if (window.desktop) {\n \t \t \t document.documentElement.className = \' desktop\' ;\n \t \t }\n \n \t \t var FIVE_MINS = 5 * 60 * 1000;\n \t \t var TEN_MINS = 10 * 60 * 1000;\n \n \t \t function randomBetween(min, max) {\n \t \t \t return Math.floor(Math.random() * (max - (min + 1))) + min;\n \t \t }\n \n \t \t window.setTimeout(function () {\n \t \t \t window.location.reload(true);\n \t \t }, randomBetween(FIVE_MINS, TEN_MINS));\n \t </script>\n </body>\n </html>'
3030
31- state = {"rate_limited_count " : 0 }
31+ state = {"ratelimited_count" : 0 , "fatal_error_count " : 0 }
3232
3333 def is_valid_user_agent (self ):
3434 user_agent = self .headers ["User-Agent" ]
@@ -98,17 +98,37 @@ def _handle(self):
9898 return
9999
100100 header = self .headers ["Authorization" ]
101- if header is not None and "xoxp-" in header :
102- pattern = str (header ).split ("xoxp-" , 1 )[1 ]
101+ if header is not None and ("xoxb-" in header or "xoxp-" in header ):
102+ pattern = ""
103+ xoxb = str (header ).split ("xoxb-" , 1 )
104+ if len (xoxb ) > 1 :
105+ pattern = xoxb [1 ]
106+ else :
107+ xoxp = str (header ).split ("xoxp-" , 1 )
108+ pattern = xoxp [1 ]
109+
103110 if "remote_disconnected" in pattern :
104111 # http.client.RemoteDisconnected
105112 self .finish ()
106113 return
107- if "ratelimited" in pattern :
114+
115+ if pattern == "ratelimited" or (pattern == "ratelimited_only_once" and self .state ["ratelimited_count" ] == 0 ):
116+ self .state ["ratelimited_count" ] += 1
108117 self .send_response (429 )
109118 self .send_header ("retry-after" , 1 )
119+ self .send_header ("content-type" , "application/json;charset=utf-8" )
120+ self .send_header ("connection" , "close" )
121+ self .end_headers ()
122+ self .wfile .write ("""{"ok":false,"error":"ratelimited"}""" .encode ("utf-8" ))
123+ self .wfile .close ()
124+ return
125+
126+ if pattern == "fatal_error" or (pattern == "fatal_error_only_once" and self .state ["fatal_error_count" ] == 0 ):
127+ self .state ["fatal_error_count" ] += 1
128+ self .send_response (200 )
110129 self .set_common_headers ()
111- self .wfile .write ("""{"ok": false, "error": "ratelimited"}""" .encode ("utf-8" ))
130+ self .wfile .write ("""{"ok":false,"error":"fatal_error"}""" .encode ("utf-8" ))
131+ self .wfile .close ()
112132 return
113133
114134 if self .is_valid_token () and self .is_valid_user_agent ():
@@ -139,22 +159,10 @@ def _handle(self):
139159 self .wfile .write ("""{"ok":false}""" .encode ("utf-8" ))
140160 return
141161
142- if pattern == "rate_limited" or (
143- pattern == "rate_limited_only_once" and self .state ["rate_limited_count" ] == 0
144- ):
145- self .state ["rate_limited_count" ] += 1
146- self .send_response (429 )
147- self .send_header ("retry-after" , 1 )
148- self .send_header ("content-type" , "application/json;charset=utf-8" )
149- self .send_header ("connection" , "close" )
150- self .end_headers ()
151- self .wfile .write ("""{"ok":false,"error":"rate_limited"}""" .encode ("utf-8" ))
152- self .wfile .close ()
153- return
154-
155162 if pattern == "timeout" :
156- time .sleep (2 )
163+ time .sleep (3 )
157164 self .send_response (200 )
165+ self .set_common_headers ()
158166 self .wfile .write ("""{"ok":true}""" .encode ("utf-8" ))
159167 self .wfile .close ()
160168 return
@@ -248,7 +256,7 @@ def __init__(self, handler: Type[SimpleHTTPRequestHandler] = MockHandler):
248256
249257 def run (self ):
250258 self .handler .received_requests = {}
251- self .handler .state = {"rate_limited_count " : 0 }
259+ self .handler .state = {"ratelimited_count " : 0 }
252260 self .server = HTTPServer (("localhost" , 8888 ), self .handler )
253261 try :
254262 self .server .serve_forever (0.05 )
@@ -257,7 +265,7 @@ def run(self):
257265
258266 def stop (self ):
259267 self .handler .received_requests = {}
260- self .handler .state = {"rate_limited_count " : 0 }
268+ self .handler .state = {"ratelimited_count " : 0 }
261269 self .server .shutdown ()
262270 self .join ()
263271
0 commit comments