TASK
Implementation
Build a basic relay proxy that forwards requests to a backend server:
- Listen for incoming client requests
- Parse the request to determine backend destination
- Forward the request to the backend
- Wait for the backend response
- Return the response to the client
Handle connection errors and timeouts gracefully.
Sample Test Cases
Forward requestTimeout: 5000ms
Input
{"src":"c0","dest":"proxy","body":{"type":"init","msg_id":1,"node_id":"proxy","node_ids":["proxy","backend"]}}
{"src":"client","dest":"proxy","body":{"type":"relay_request","msg_id":2,"path":"/api/data","method":"GET"}}
Expected Output
{"src":"proxy","dest":"c0","body":{"type":"init_ok","in_reply_to":1,"msg_id":0}}
{"src":"proxy","dest":"client","body":{"type":"relay_response","in_reply_to":2,"msg_id":1,"status":200,"path":"/api/data"}}
Hints
Hint 1▾
Accept incoming requests
Hint 2▾
Forward to backend server
Hint 3▾
Return response to client
OVERVIEW
Theoretical Hub
What is a Proxy?
A proxy sits between clients and servers, intercepting and forwarding requests. Proxies can add functionality like caching, load balancing, security, and logging without modifying client or server code.
Forward vs Reverse Proxy
A forward proxy acts on behalf of clients (e.g., corporate firewall). A reverse proxy acts on behalf of servers (e.g., NGINX in front of application servers). We will build a reverse proxy.
Key Concepts
proxyforwardingrequest handling
main.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python3
import sys
import json
import socket
import threading
class RelayProxy:
def __init__(self, listen_port, backend_host, backend_port):
self.listen_port = listen_port
self.backend = (backend_host, backend_port)
def forward_request(self, request):
# TODO: Connect to backend, send request, return response
pass
def handle_client(self, client_socket):
# TODO: Receive request, forward, send response back
pass
def start(self):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('0.0.0.0', self.listen_port))
server.listen(100)
while True:
client, addr = server.accept()
thread = threading.Thread(target=self.handle_client, args=
(client,))
thread.start()
if __name__ == "__main__":
proxy = RelayProxy(8080, 'localhost', 9000)
proxy.start()