On 10/27/23 18:27, Jayaprakash, N wrote: > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4580 > > This BZ has been created to provide the sample python scripts > to demonstrate the socket client capabilities using http library > on UEFI shell with the help of Python UEFI interpreter. > The http_echo_client.py and http_echo_server.py scripts > are provided as sample scripts to exercise the python http library > from UEFI shell. > > Cc: Rebecca Cran <rebe...@bsdio.com> > Cc: Michael D Kinney <michael.d.kin...@intel.com> > Cc: Jayaprakash N <n.jayaprak...@intel.com> > Signed-off-by: Jayaprakash Nevara <n.jayaprak...@intel.com> > --- > .../PyMod-3.6.8/Lib/http_echo_client.py | 81 +++++++++++++++++++ > .../PyMod-3.6.8/Lib/http_echo_server.py | 61 ++++++++++++++ > 2 files changed, 142 insertions(+) > create mode 100644 > AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Lib/http_echo_client.py > create mode 100644 > AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Lib/http_echo_server.py > > diff --git > a/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Lib/http_echo_client.py > b/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Lib/http_echo_client.py > new file mode 100644 > index 0000000..ea0368d > --- /dev/null > +++ > b/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Lib/http_echo_client.py > @@ -0,0 +1,81 @@ > +""" > +This is a sample HTTP echo client sends data to the server > +and gets echoed data from the server in response body > +and prints the same to the console. > + > +Note: This application needs to be run from UEFI shell using > +the Python UEFI interpreter. > +""" > + > +import sys > +import time > +from http import client > +from http.client import HTTPException > +import traceback > + > +_max_retries = 10 > +_retry_count = 0 > + > + > +def _print_usage(): > + print("Sample http echo client application") > + print("Usage:") > + print("python.efi http_echo_client.py <ServerIPAddress>") > + > + > +if len(sys.argv) != 2: > + _print_usage() > + sys.exit(0) > + > +if sys.argv[1] == "-h": > + _print_usage() > + sys.exit(0) > + > +http_server = sys.argv[1] > +while True: > + try: > + name = input("Enter the parameter name:") > + value = input("Enter parameter value:") > + print("Connecting to server to send a get request with following > parameter") > + print("{}={}".format(name, value)) > + # replace space with %20
Better use <https://docs.python.org/3/library/urllib.parse.html#url-quoting> here, I'd think. Laszlo > + value = value.replace(" ", "%20") > + conn = client.HTTPConnection(http_server) > + # Send GET request with some data > + conn.request("GET", "/echo?{}={}".format(name, value)) > + rsp = conn.getresponse() > + if rsp.status == 204: > + print("No content") > + break > + elif rsp.status == 200: > + data_received = rsp.read() > + # replace %20 with space character before displaying to console > + data_received = data_received.replace(b"%20", b" ") > + print("from server:{}".format(data_received)) > + conn.close() > + print("Closing the connection") > + break > + else: > + print("Invalid response code {}".format(rsp.status)) > + conn.close() > + print("Closing the connection") > + break > + except HTTPException as exp: > + print("Got exception while connecting to server : {}".format(exp)) > + traceback.print_exc() > + break > + except ConnectionRefusedError as exp: > + print("Got exception while connecting to server : {}".format(exp)) > + print("Check & start the server, if it is not started") > + print( > + "Retrying connection after 10 seconds, retry count = {}".format( > + _retry_count + 1 > + ) > + ) > + if _retry_count == _max_retries: > + print( > + "Exceeded max retries {} exiting the > application".format(_max_retries) > + ) > + break > + time.sleep(10) > + _retry_count += 1 > diff --git > a/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Lib/http_echo_server.py > b/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Lib/http_echo_server.py > new file mode 100644 > index 0000000..eebdf33 > --- /dev/null > +++ > b/AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/Lib/http_echo_server.py > @@ -0,0 +1,61 @@ > +""" > +This is a sample HTTP echo server that echos the command / data > +coming from the client. > +Here the data is received from client through GET request in the > +form of parameter of GET request. > +The parameter is extracted and sent back to the client > +in the response body. > + > +Note that this server sample application needs to be run > +on a system booted to OS. > +""" > + > +import os > +import socket > +import sys > +from http.server import BaseHTTPRequestHandler, HTTPServer > +from http.client import parse_headers > + > + > +class MyHTTPRequestHandler(BaseHTTPRequestHandler): > + """HTTP request handler class""" > + > + # Handle GET command > + def do_GET(self): > + print("path {}".format(self.path)) > + path = self.path.split("?")[0] > + param_name = self.path.split("?")[1].split("=")[0] > + param_value = self.path.split("?")[1].split("=")[1] > + print("param name {} value = {}".format(param_name, param_value)) > + if path == "/echo": > + self.send_response(200) > + self.send_header("Content-type", "text/plain") > + self.end_headers() > + self.wfile.write( > + bytes("{}={}".format(param_name, param_value), > encoding="utf-8") > + ) > + else: > + print("invalid request") > + self.send_response(204) > + > + > +def run(): > + try: > + print("Starting the server...") > + server_address = (socket.gethostbyname(socket.gethostname()), 80) > + print("Server address :", server_address) > + httpd = HTTPServer(server_address, MyHTTPRequestHandler) > + print("\n\n\nPress CTRL+C to exit server application") > + httpd.serve_forever() > + except KeyboardInterrupt as exp: > + print("KeyboardInterrupt") > + sys.exit(0) > + except Exception as exp: > + print(str(exp)) > + > + > +if __name__ == "__main__": > + if os.name == "edk2": > + print("HTTP echo server not supported on EDk2") > + sys.exit(0) > + run() -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#110239): https://edk2.groups.io/g/devel/message/110239 Mute This Topic: https://groups.io/mt/102224955/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-