|
9 | 9 |
|
10 | 10 | import logging
|
11 | 11 |
|
| 12 | +from opensearch_sdk_py.actions.internal.register_rest_actions_response_handler import RegisterRestActionsResponseHandler |
12 | 13 | from opensearch_sdk_py.actions.request_handler import RequestHandler
|
| 14 | +from opensearch_sdk_py.actions.response_handlers import ResponseHandlers |
13 | 15 | from opensearch_sdk_py.api.action_extension import ActionExtension
|
14 | 16 | from opensearch_sdk_py.transport.initialize_extension_request import InitializeExtensionRequest
|
| 17 | +from opensearch_sdk_py.transport.initialize_extension_response import InitializeExtensionResponse |
15 | 18 | from opensearch_sdk_py.transport.outbound_message_request import OutboundMessageRequest
|
| 19 | +from opensearch_sdk_py.transport.outbound_message_response import OutboundMessageResponse |
16 | 20 | from opensearch_sdk_py.transport.register_rest_actions_request import RegisterRestActionsRequest
|
17 | 21 | from opensearch_sdk_py.transport.stream_input import StreamInput
|
18 | 22 | from opensearch_sdk_py.transport.stream_output import StreamOutput
|
19 | 23 |
|
20 | 24 |
|
21 | 25 | class DiscoveryExtensionsRequestHandler(RequestHandler):
|
22 |
| - def __init__(self, extension: ActionExtension) -> None: |
| 26 | + def __init__(self, extension: ActionExtension, response_handlers: ResponseHandlers) -> None: |
23 | 27 | super().__init__("internal:discovery/extensions", extension)
|
| 28 | + self.response_handlers = response_handlers |
24 | 29 |
|
25 | 30 | def handle(self, request: OutboundMessageRequest, input: StreamInput) -> StreamOutput:
|
26 | 31 | initialize_extension_request = InitializeExtensionRequest().read_from(input)
|
27 | 32 | logging.debug(f"< {initialize_extension_request}")
|
28 | 33 |
|
| 34 | + # Create the response message preserving the request id, but don't send it yet. |
| 35 | + # This will be sent when response handler calls send() |
| 36 | + self.response = OutboundMessageResponse( |
| 37 | + request.thread_context_struct, |
| 38 | + request.features, |
| 39 | + InitializeExtensionResponse(self.extension.name, self.extension.implemented_interfaces), |
| 40 | + request.version, |
| 41 | + request.request_id, |
| 42 | + request.is_handshake, |
| 43 | + request.is_compress, |
| 44 | + ) |
| 45 | + |
29 | 46 | # Sometime between tcp and transport handshakes and the eventual response,
|
30 | 47 | # the uniqueId gets added to the thread context.
|
31 | 48 | # request.thread_context_struct.request_headers["extension_unique_id"] = self.extension.name
|
32 |
| - self.extension.init_response_request_id = request.request_id |
33 |
| - |
34 |
| - return self.send( |
35 |
| - OutboundMessageRequest( |
36 |
| - thread_context=request.thread_context_struct, |
37 |
| - features=request.features, |
38 |
| - message=RegisterRestActionsRequest(self.extension.name, self.extension.named_routes), |
39 |
| - version=request.version, |
40 |
| - action="internal:discovery/registerrestactions", |
41 |
| - is_handshake=False, |
42 |
| - is_compress=False, |
43 |
| - ) |
| 49 | + |
| 50 | + # Now send our own initialization requests. |
| 51 | + |
| 52 | + # Create the request, this gets us an auto-increment request id |
| 53 | + register_request = OutboundMessageRequest( |
| 54 | + thread_context=request.thread_context_struct, |
| 55 | + features=request.features, |
| 56 | + message=RegisterRestActionsRequest(self.extension.name, self.extension.named_routes), |
| 57 | + version=request.version, |
| 58 | + action="internal:discovery/registerrestactions", |
| 59 | + is_handshake=False, |
| 60 | + is_compress=False, |
44 | 61 | )
|
| 62 | + # Register response handler to handle this request ID invoking this class's send() |
| 63 | + register_response_handler = RegisterRestActionsResponseHandler(self) |
| 64 | + self.response_handlers.register(register_request.request_id, register_response_handler) |
| 65 | + # Now send the request |
| 66 | + return register_response_handler.send(register_request) |
0 commit comments