Skip to content

Instantly share code, notes, and snippets.

@alekxeyuk
Last active September 12, 2021 06:43
Show Gist options
  • Save alekxeyuk/e8fcf4aa993552c90ef765f02375c11d to your computer and use it in GitHub Desktop.
Save alekxeyuk/e8fcf4aa993552c90ef765f02375c11d to your computer and use it in GitHub Desktop.
URL shortener
from http.server import BaseHTTPRequestHandler
from http.server import ThreadingHTTPServer
from typing import Dict
from uuid import uuid4
import json
database: Dict[str, str] = dict()
class HttpGetHandler(BaseHTTPRequestHandler):
def _set_headers(self, status: int = 200, c_type: str = "text/html"):
self.send_response(status)
self.send_header("Content-type", c_type)
self.end_headers()
def _json(self, status: int, message: Dict[str, str]):
self._set_headers(status, "application/json")
return json.dumps(message).encode("utf8")
def do_GET(self):
if self.path == "/":
message = {"message": "Welcome to the main page"}
self.wfile.write(self._json(200, message))
elif self.path in database:
self.send_response(301)
self.send_header('Location', database[self.path])
self.end_headers()
else:
message = {"error": "No such url in db"}
self.wfile.write(self._json(404, message))
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = json.loads(self.rfile.read(content_length).decode("utf-8"))
if "long" in post_data:
short = "/" + str(uuid4())
database.update({short: post_data["long"]})
message = {"short": f"http://localhost:8000/{short[1:]}"}
self.wfile.write(self._json(200, message))
else:
message = {"error": "Your data is wrong"}
self.wfile.write(self._json(404, message))
def run(server_class = ThreadingHTTPServer, handler_class = HttpGetHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
try:
httpd.serve_forever()
except KeyboardInterrupt:
httpd.server_close()
if __name__ == "__main__":
run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment