diff options
| author | Joshua Watt <JPEWhacker@gmail.com> | 2024-02-22 15:31:48 -0700 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2024-02-27 11:36:38 +0000 |
| commit | be57fda5423eae49133fa0fdecaa30e4d9f57026 (patch) | |
| tree | 8802ac653d428463db3e3941d6a4c796152d8be0 /bitbake | |
| parent | 28414495277e87898c9ac5314b88ebb747494dac (diff) | |
| download | poky-be57fda5423eae49133fa0fdecaa30e4d9f57026.tar.gz | |
bitbake: asyncrpc: Add support for server headers
Adds support for asyncrpc servers to send connection headers to clients
on connection. Since this is a breaking protocol change, clients must
opt-in to expect headers from the server, corresponding to a version
bump in the client protocol.
(Bitbake rev: 1cb2b8be6cc5269553f549285592e47b7d29db03)
Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
| -rw-r--r-- | bitbake/lib/bb/asyncrpc/client.py | 33 | ||||
| -rw-r--r-- | bitbake/lib/bb/asyncrpc/serv.py | 16 |
2 files changed, 46 insertions, 3 deletions
diff --git a/bitbake/lib/bb/asyncrpc/client.py b/bitbake/lib/bb/asyncrpc/client.py index a6228bb0ba..29a5ab76aa 100644 --- a/bitbake/lib/bb/asyncrpc/client.py +++ b/bitbake/lib/bb/asyncrpc/client.py | |||
| @@ -17,13 +17,24 @@ from .exceptions import ConnectionClosedError, InvokeError | |||
| 17 | 17 | ||
| 18 | 18 | ||
| 19 | class AsyncClient(object): | 19 | class AsyncClient(object): |
| 20 | def __init__(self, proto_name, proto_version, logger, timeout=30): | 20 | def __init__( |
| 21 | self, | ||
| 22 | proto_name, | ||
| 23 | proto_version, | ||
| 24 | logger, | ||
| 25 | timeout=30, | ||
| 26 | server_headers=False, | ||
| 27 | headers={}, | ||
| 28 | ): | ||
| 21 | self.socket = None | 29 | self.socket = None |
| 22 | self.max_chunk = DEFAULT_MAX_CHUNK | 30 | self.max_chunk = DEFAULT_MAX_CHUNK |
| 23 | self.proto_name = proto_name | 31 | self.proto_name = proto_name |
| 24 | self.proto_version = proto_version | 32 | self.proto_version = proto_version |
| 25 | self.logger = logger | 33 | self.logger = logger |
| 26 | self.timeout = timeout | 34 | self.timeout = timeout |
| 35 | self.needs_server_headers = server_headers | ||
| 36 | self.server_headers = {} | ||
| 37 | self.headers = headers | ||
| 27 | 38 | ||
| 28 | async def connect_tcp(self, address, port): | 39 | async def connect_tcp(self, address, port): |
| 29 | async def connect_sock(): | 40 | async def connect_sock(): |
| @@ -61,9 +72,29 @@ class AsyncClient(object): | |||
| 61 | async def setup_connection(self): | 72 | async def setup_connection(self): |
| 62 | # Send headers | 73 | # Send headers |
| 63 | await self.socket.send("%s %s" % (self.proto_name, self.proto_version)) | 74 | await self.socket.send("%s %s" % (self.proto_name, self.proto_version)) |
| 75 | await self.socket.send( | ||
| 76 | "needs-headers: %s" % ("true" if self.needs_server_headers else "false") | ||
| 77 | ) | ||
| 78 | for k, v in self.headers.items(): | ||
| 79 | await self.socket.send("%s: %s" % (k, v)) | ||
| 80 | |||
| 64 | # End of headers | 81 | # End of headers |
| 65 | await self.socket.send("") | 82 | await self.socket.send("") |
| 66 | 83 | ||
| 84 | self.server_headers = {} | ||
| 85 | if self.needs_server_headers: | ||
| 86 | while True: | ||
| 87 | line = await self.socket.recv() | ||
| 88 | if not line: | ||
| 89 | # End headers | ||
| 90 | break | ||
| 91 | tag, value = line.split(":", 1) | ||
| 92 | self.server_headers[tag.lower()] = value.strip() | ||
| 93 | |||
| 94 | async def get_header(self, tag, default): | ||
| 95 | await self.connect() | ||
| 96 | return self.server_headers.get(tag, default) | ||
| 97 | |||
| 67 | async def connect(self): | 98 | async def connect(self): |
| 68 | if self.socket is None: | 99 | if self.socket is None: |
| 69 | self.socket = await self._connect_sock() | 100 | self.socket = await self._connect_sock() |
diff --git a/bitbake/lib/bb/asyncrpc/serv.py b/bitbake/lib/bb/asyncrpc/serv.py index f0be9a6cdb..a66117acad 100644 --- a/bitbake/lib/bb/asyncrpc/serv.py +++ b/bitbake/lib/bb/asyncrpc/serv.py | |||
| @@ -39,10 +39,14 @@ class AsyncServerConnection(object): | |||
| 39 | "address": socket.address, | 39 | "address": socket.address, |
| 40 | }, | 40 | }, |
| 41 | ) | 41 | ) |
| 42 | self.client_headers = {} | ||
| 42 | 43 | ||
| 43 | async def close(self): | 44 | async def close(self): |
| 44 | await self.socket.close() | 45 | await self.socket.close() |
| 45 | 46 | ||
| 47 | async def handle_headers(self, headers): | ||
| 48 | return {} | ||
| 49 | |||
| 46 | async def process_requests(self): | 50 | async def process_requests(self): |
| 47 | try: | 51 | try: |
| 48 | self.logger.info("Client %r connected" % (self.socket.address,)) | 52 | self.logger.info("Client %r connected" % (self.socket.address,)) |
| @@ -64,12 +68,20 @@ class AsyncServerConnection(object): | |||
| 64 | ) | 68 | ) |
| 65 | return | 69 | return |
| 66 | 70 | ||
| 67 | # Read headers. Currently, no headers are implemented, so look for | 71 | # Read headers |
| 68 | # an empty line to signal the end of the headers | 72 | self.client_headers = {} |
| 69 | while True: | 73 | while True: |
| 70 | header = await self.socket.recv() | 74 | header = await self.socket.recv() |
| 71 | if not header: | 75 | if not header: |
| 76 | # Empty line. End of headers | ||
| 72 | break | 77 | break |
| 78 | tag, value = header.split(":", 1) | ||
| 79 | self.client_headers[tag.lower()] = value.strip() | ||
| 80 | |||
| 81 | if self.client_headers.get("needs-headers", "false") == "true": | ||
| 82 | for k, v in (await self.handle_headers(self.client_headers)).items(): | ||
| 83 | await self.socket.send("%s: %s" % (k, v)) | ||
| 84 | await self.socket.send("") | ||
| 73 | 85 | ||
| 74 | # Handle messages | 86 | # Handle messages |
| 75 | while True: | 87 | while True: |
