59 lines
1.9 KiB
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")))))
|