"""Run: python requests_demo.py. Uses a temporary localhost server, not a public API."""
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from urllib.parse import urlparse,parse_qs
from threading import Thread
import json
import requests

class Handler(BaseHTTPRequestHandler):
    def log_message(self,*args):pass
    def reply(self,status,payload,content_type='application/json; charset=utf-8'):
        data=payload if isinstance(payload,bytes) else json.dumps(payload).encode()
        self.send_response(status);self.send_header('Content-Type',content_type);self.send_header('Content-Length',str(len(data)));self.end_headers();self.wfile.write(data)
    def do_GET(self):
        route=urlparse(self.path)
        if route.path=='/scores':
            team=parse_qs(route.query).get('team',['A'])[0]
            self.reply(200,{'team':team,'scores':[80,90] if team=='A' else [70,0]})
        elif route.path=='/bad-json':self.reply(200,b'not JSON','text/plain')
        else:self.reply(404,{'error':'not found'})
    def do_POST(self):
        if self.path!='/echo':self.reply(404,{'error':'not found'});return
        try:payload=json.loads(self.rfile.read(int(self.headers.get('Content-Length','0'))))
        except (ValueError,TypeError):self.reply(400,{'error':'invalid JSON'});return
        self.reply(200,{'received':payload})

def main():
    server=ThreadingHTTPServer(('127.0.0.1',0),Handler)
    thread=Thread(target=server.serve_forever,daemon=True);thread.start()
    base=f'http://127.0.0.1:{server.server_port}'
    try:
        with requests.Session() as session:
            session.trust_env=False  # local demonstration should not use a system HTTP proxy
            response=session.get(base+'/scores',params={'team':'A'},timeout=(2,5))
            response.raise_for_status();data=response.json()
            assert data=={'team':'A','scores':[80,90]}
            print('GET:',response.status_code,data)
            response=session.post(base+'/echo',json={'name':'ArcLab'},timeout=(2,5))
            response.raise_for_status();assert response.json()['received']=={'name':'ArcLab'}
            print('POST:',response.status_code,response.json())
            try:session.get(base+'/missing',timeout=(2,5)).raise_for_status()
            except requests.HTTPError:print('404: HTTPError caught')
            else:raise AssertionError('404 was not rejected')
            try:session.get(base+'/bad-json',timeout=(2,5)).json()
            except requests.exceptions.JSONDecodeError:print('200 with invalid JSON: JSONDecodeError caught')
            else:raise AssertionError('invalid JSON was not rejected')
    finally:
        server.shutdown();server.server_close();thread.join()
if __name__=='__main__':main()
