From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 05A869414D4 for ; Sat, 28 Oct 2023 10:25:23 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=bTioi86LnX0Er17VE4oGqpZ6wL5lnbs7jMx9S4BLXzM=; c=relaxed/simple; d=groups.io; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From:In-Reply-To:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Language:Content-Type:Content-Transfer-Encoding; s=20140610; t=1698488722; v=1; b=TfKgjK0piGYw4ChSuAOvO9OE+mD89q07G1Q/1qtmaV7I57nsdF9p0teneN6wzU07WOt9dZpC aomqPx+mBh7LnhP/BrhLQaLB+TKZBKDRO+koQ/tbc064yyy6m4T5Z0v2QQwlGe5d15S0ESo7+xJ qByycX9xBdBOXiyT7j/FGx1Y= X-Received: by 127.0.0.2 with SMTP id vYZwYY7687511xoRIASQ1HjX; Sat, 28 Oct 2023 03:25:22 -0700 X-Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.groups.io with SMTP id smtpd.web10.15698.1698488721612001044 for ; Sat, 28 Oct 2023 03:25:21 -0700 X-Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-689-8vLdKw04P3KcZwtrQlxDyw-1; Sat, 28 Oct 2023 06:25:18 -0400 X-MC-Unique: 8vLdKw04P3KcZwtrQlxDyw-1 X-Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 92B1C801958; Sat, 28 Oct 2023 10:25:18 +0000 (UTC) X-Received: from [10.39.192.70] (unknown [10.39.192.70]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A23D52166B26; Sat, 28 Oct 2023 10:25:17 +0000 (UTC) Message-ID: <5a7f8dfa-9f03-180b-3357-97f5b79d18a6@redhat.com> Date: Sat, 28 Oct 2023 12:25:16 +0200 MIME-Version: 1.0 Subject: Re: [edk2-devel] [edk2-libc Patch 1/1] ek2-libc: Sample python scripts for socket client capabilities on UEFI shell To: devel@edk2.groups.io, n.jayaprakash@intel.com Cc: Rebecca Cran , Michael D Kinney References: <20231027162718.830-1-n.jayaprakash@intel.com> <20231027162718.830-2-n.jayaprakash@intel.com> From: "Laszlo Ersek" In-Reply-To: <20231027162718.830-2-n.jayaprakash@intel.com> X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.6 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,lersek@redhat.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: GgbD8iIvtoO3sZdp8xtSY5kfx7686176AA= Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=TfKgjK0p; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=redhat.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io On 10/27/23 18:27, Jayaprakash, N wrote: > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4580 >=20 > 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. >=20 > Cc: Rebecca Cran > Cc: Michael D Kinney > Cc: Jayaprakash N > Signed-off-by: Jayaprakash Nevara > --- > .../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/L= ib/http_echo_client.py > create mode 100644 AppPkg/Applications/Python/Python-3.6.8/PyMod-3.6.8/L= ib/http_echo_server.py >=20 > 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/h= ttp_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_c= lient.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=20 > +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 =3D 10 > +_retry_count =3D 0 > + > + > +def _print_usage(): > + print("Sample http echo client application") > + print("Usage:") > + print("python.efi http_echo_client.py ") > + > + > +if len(sys.argv) !=3D 2: > + _print_usage() > + sys.exit(0) > + > +if sys.argv[1] =3D=3D "-h": > + _print_usage() > + sys.exit(0) > + > +http_server =3D sys.argv[1] > +while True: > + try: > + name =3D input("Enter the parameter name:") > + value =3D input("Enter parameter value:") > + print("Connecting to server to send a get request with following= parameter") > + print("{}=3D{}".format(name, value)) > + # replace space with %20 Better use here, I'd think. Laszlo > + value =3D value.replace(" ", "%20") > + conn =3D client.HTTPConnection(http_server) > + # Send GET request with some data > + conn.request("GET", "/echo?{}=3D{}".format(name, value)) > + rsp =3D conn.getresponse() > + if rsp.status =3D=3D 204: > + print("No content") > + break > + elif rsp.status =3D=3D 200: > + data_received =3D rsp.read() > + # replace %20 with space character before displaying to cons= ole > + data_received =3D 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 =3D {}".f= ormat( > + _retry_count + 1 > + ) > + ) > + if _retry_count =3D=3D _max_retries: > + print( > + "Exceeded max retries {} exiting the application".format= (_max_retries) > + ) > + break > + time.sleep(10) > + _retry_count +=3D 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/h= ttp_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_s= erver.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=20 > +form of parameter of GET request. > +The parameter is extracted and sent back to the client=20 > +in the response body. > + > +Note that this server sample application needs to be run=20 > +on a system booted to OS.=20 > +""" > + > +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 =3D self.path.split("?")[0] > + param_name =3D self.path.split("?")[1].split("=3D")[0] > + param_value =3D self.path.split("?")[1].split("=3D")[1] > + print("param name {} value =3D {}".format(param_name, param_valu= e)) > + if path =3D=3D "/echo": > + self.send_response(200) > + self.send_header("Content-type", "text/plain") > + self.end_headers() > + self.wfile.write( > + bytes("{}=3D{}".format(param_name, param_value), encodin= g=3D"utf-8") > + ) > + else: > + print("invalid request") > + self.send_response(204) > + > + > +def run(): > + try: > + print("Starting the server...") > + server_address =3D (socket.gethostbyname(socket.gethostname()), = 80) > + print("Server address :", server_address) > + httpd =3D 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__ =3D=3D "__main__": > + if os.name =3D=3D "edk2": > + print("HTTP echo server not supported on EDk2") > + sys.exit(0) > + run() -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- 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/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/leave/12367111/7686176/19134562= 12/xyzzy [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-