Files
natalieee.net/srv/main.hy

59 lines
1.9 KiB
Hy

(import socket [socket AF_INET SOCK_STREAM SOL_SOCKET SO_REUSEADDR])
(import threading [Thread])
(import log [log])
(import traceback [format-exc])
(import http-utils :as http)
(import content.router [match-request])
(require hyrule.control [defmain])
(try
(import srv-config [ADDRESS PORT])
(except [ModuleNotFoundError]
(setv [ADDRESS PORT] ["127.0.0.1" 5000])))
(defmain []
(let [socket (socket AF_INET SOCK_STREAM)]
(try
(.setsockopt socket SOL_SOCKET SO_REUSEADDR 1)
(.bind socket #(ADDRESS PORT))
(.listen socket 10)
(.debug log "socket bound")
(while True
(try
(.start
(Thread
:target (fn [client-socket address]
(try
(setv request-data (bytes))
(while (setx data (.recv client-socket 1024))
(+= request-data data)
(when (< (len data) 1024)
(break)))
(setv parsed-request (http.request.parse-data request-data))
(.debug log parsed-request)
(.info log (+ (str (cond
(in "X-Real-IP" (. parsed-request (get "headers"))) (. parsed-request (get "headers") (get "X-Real-IP"))
True (get address 0))) f": {(. parsed-request (get "method"))} {(. parsed-request (get "route") (get "path"))}"))
(setv response (match-request parsed-request))
(.sendall client-socket (http.response.send #** response))
(except [e Exception]
(.warn log (format-exc))
(.close client-socket))))
:args #(#* (socket.accept))))
(except [e Exception]
(.warn log (format-exc)))))
(except [e Exception]
(.critical log (format-exc)))
(finally
(.close socket)
(.info log "server shut down")))))