summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/asyncrpc/client.py
diff options
context:
space:
mode:
authorJoshua Watt <JPEWhacker@gmail.com>2024-02-22 15:31:48 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2024-02-27 11:36:38 +0000
commitbe57fda5423eae49133fa0fdecaa30e4d9f57026 (patch)
tree8802ac653d428463db3e3941d6a4c796152d8be0 /bitbake/lib/bb/asyncrpc/client.py
parent28414495277e87898c9ac5314b88ebb747494dac (diff)
downloadpoky-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/lib/bb/asyncrpc/client.py')
-rw-r--r--bitbake/lib/bb/asyncrpc/client.py33
1 files changed, 32 insertions, 1 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
19class AsyncClient(object): 19class 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()