-
Notifications
You must be signed in to change notification settings - Fork 283
Expand file tree
/
Copy pathasync_request.py
More file actions
83 lines (73 loc) · 3.01 KB
/
async_request.py
File metadata and controls
83 lines (73 loc) · 3.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
from typing import Dict, Optional, Union, Any, Sequence
from slack_bolt.context.async_context import AsyncBoltContext
from slack_bolt.error import BoltError
from slack_bolt.request.async_internals import build_async_context
from slack_bolt.request.internals import (
parse_query,
parse_body,
build_normalized_headers,
extract_content_type,
error_message_raw_body_required_in_http_mode,
)
class AsyncBoltRequest:
raw_body: str
body: Dict[str, Any]
query: Dict[str, Sequence[str]]
headers: Dict[str, Sequence[str]]
content_type: Optional[str]
context: AsyncBoltContext
lazy_only: bool
lazy_function_name: Optional[str]
mode: str # either "http" or "socket_mode"
def __init__(
self,
*,
body: Union[str, dict],
query: Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]] = None,
headers: Optional[Dict[str, Union[str, Sequence[str]]]] = None,
context: Optional[Dict[str, Any]] = None,
mode: str = "http", # either "http" or "socket_mode"
):
"""Request to a Bolt app.
Args:
body: The raw request body (only plain text is supported for "http" mode)
query: The query string data in any data format.
headers: The request headers.
context: The context in this request.
mode: The mode used for this request. (either "http" or "socket_mode")
"""
if mode == "http":
# HTTP Mode
if body is not None and not isinstance(body, str):
raise BoltError(error_message_raw_body_required_in_http_mode())
self.raw_body = body if body is not None else ""
else:
# Socket Mode
if body is not None and isinstance(body, str):
self.raw_body = body
else:
# We don't convert the dict value to str
# as doing so does not guarantee to keep the original structure/format.
self.raw_body = ""
self.query = parse_query(query)
self.headers = build_normalized_headers(headers)
self.content_type = extract_content_type(self.headers)
if isinstance(body, str):
self.body = parse_body(self.raw_body, self.content_type)
elif isinstance(body, dict):
self.body = body
else:
self.body = {}
self.context = build_async_context(AsyncBoltContext(context if context else {}), self.body, self.headers)
self.lazy_only = bool(self.headers.get("x-slack-bolt-lazy-only", [False])[0])
self.lazy_function_name = self.headers.get("x-slack-bolt-lazy-function-name", [None])[0]
self.mode = mode
def to_copyable(self) -> "AsyncBoltRequest":
body: Union[str, dict] = self.raw_body if self.mode == "http" else self.body
return AsyncBoltRequest(
body=body,
query=self.query,
headers=self.headers,
context=self.context.to_copyable(),
mode=self.mode,
)