(self)
| 73 | } |
| 74 | |
| 75 | def _handle(self): |
| 76 | try: |
| 77 | # put_nowait is common between Queue & asyncio.Queue, it does not need to be awaited |
| 78 | self.server.queue.put_nowait(self.path) |
| 79 | |
| 80 | if self.path in {"/oauth.access", "/oauth.v2.access"}: |
| 81 | self.send_response(200) |
| 82 | self.set_common_headers() |
| 83 | if self.headers["authorization"] == "Basic MTExLjIyMjpzZWNyZXQ=": |
| 84 | self.wfile.write("""{"ok":true}""".encode("utf-8")) |
| 85 | return |
| 86 | elif self.headers["authorization"] == "Basic MTExLjIyMjp0b2tlbl9yb3RhdGlvbl9zZWNyZXQ=": |
| 87 | self.wfile.write(json.dumps(self.token_refresh).encode("utf-8")) |
| 88 | return |
| 89 | else: |
| 90 | self.wfile.write("""{"ok":false, "error":"invalid"}""".encode("utf-8")) |
| 91 | return |
| 92 | |
| 93 | header = self.headers["Authorization"] |
| 94 | if header is not None and ("xoxb-" in header or "xoxp-" in header): |
| 95 | pattern = "" |
| 96 | xoxb = str(header).split("xoxb-", 1) |
| 97 | if len(xoxb) > 1: |
| 98 | pattern = xoxb[1] |
| 99 | else: |
| 100 | xoxp = str(header).split("xoxp-", 1) |
| 101 | pattern = xoxp[1] |
| 102 | |
| 103 | if "remote_disconnected" in pattern: |
| 104 | # http.client.RemoteDisconnected |
| 105 | self.finish() |
| 106 | return |
| 107 | |
| 108 | if pattern == "ratelimited" or (pattern == "ratelimited_only_once" and self.state["ratelimited_count"] == 0): |
| 109 | self.state["ratelimited_count"] += 1 |
| 110 | self.send_response(429) |
| 111 | self.send_header("retry-after", 1) |
| 112 | self.send_header("content-type", "application/json;charset=utf-8") |
| 113 | self.send_header("connection", "close") |
| 114 | self.end_headers() |
| 115 | self.wfile.write("""{"ok":false,"error":"ratelimited"}""".encode("utf-8")) |
| 116 | self.wfile.close() |
| 117 | return |
| 118 | |
| 119 | if pattern == "fatal_error" or (pattern == "fatal_error_only_once" and self.state["fatal_error_count"] == 0): |
| 120 | self.state["fatal_error_count"] += 1 |
| 121 | self.send_response(200) |
| 122 | self.set_common_headers() |
| 123 | self.wfile.write("""{"ok":false,"error":"fatal_error"}""".encode("utf-8")) |
| 124 | self.wfile.close() |
| 125 | return |
| 126 | |
| 127 | if self.is_valid_token() and self.is_valid_user_agent(): |
| 128 | parsed_path = urlparse(self.path) |
| 129 | |
| 130 | len_header = self.headers.get("Content-Length") or 0 |
| 131 | content_len = int(len_header) |
| 132 | post_body = self.rfile.read(content_len) |
no test coverage detected