func serve(q *http.Query) { req := q.GetRequest() if req.Body != nil { req.Body.Close() } resp := process(req, q.RemoteAddr()) asc := q.Hijack() asc.Write(req, resp) conn, _, _ := asc.Close() if conn != nil { conn.Close() } }
func (s *Server) serve(q *http.Query) { q.Continue() req := q.GetRequest() if req.Body != nil { req.Body.Close() } s.log(req, q.RemoteAddr()) // Path cleanup path := path.Clean(req.URL.Path) if path == "" { path = "/" } // Host analysis hostport := strings.Split(req.Host, ":", 2) if len(hostport) == 0 { q.Write(newRespBadRequest()) return } hostparts := misc.ReverseHost(strings.Split(hostport[0], ".", -1)) // http://5ttt.org, http://www.5ttt.org if len(hostparts) < 3 || hostparts[2] == "www" { if path == "/" { path = "/index.html" } if isIndex(path) { s.lk.Lock() s.stats.Views++ s.lk.Unlock() } var resp *http.Response if isIndex(path) { resp = s.replyIndex() } else { resp = s.replyStatic(path) } if isDownload(path) && resp.Body != nil { resp.Body = http.NewRunOnClose(resp.Body, func() { // TODO: This also counts incomplete downloads, but for now // it's fine. s.lk.Lock() s.stats.Downloads++ s.lk.Unlock() }) } q.Write(resp) return } // Remove 5ttt.org from host hostparts = hostparts[2:] // http://*.a.5ttt.org/* if hostparts[0] == "a" { q.Write(s.replyStatic("/tadmin.html")) // Trying to access a Tonika Admin return } // http://*.[id].5ttt.org if _, err := sys.ParseId(hostparts[0]); err == nil { q.Write(s.replyStatic("/turl.html")) // Trying to access a Tonika URL return } // Otherwise q.Write(newRespNotFound()) }