#!/usr/bin/env python # coding: utf-8 from __future__ import print_function import time import hashlib from .__init__ import * from .util import * if not PY2: unicode = str class HttpCli(object): def __init__(self, sck, addr, args, log_func): self.s = sck self.addr = addr self.args = args self.sr = Unrecv(sck) self.bufsz = 1024 * 32 self.workload = 0 self.ok = True self.log_func = log_func self.log_src = "{} \033[36m{}".format(addr[0], addr[1]).ljust(26) def log(self, msg): self.log_func(self.log_src, msg) def run(self): while self.ok: headerlines = self.read_header() if not self.ok: return self.headers = {} try: mode, self.req, _ = headerlines[0].split(" ") except: self.log("bad headers:\n" + "\n".join(headerlines)) self.s.close() return for header_line in headerlines[1:]: k, v = header_line.split(":", 1) self.headers[k.lower()] = v.strip() # self.bufsz = int(self.req.split('/')[-1]) * 1024 if mode == "GET": self.handle_get() elif mode == "POST": self.handle_post() else: self.loud_reply(u'invalid HTTP mode "{0}"'.format(mode)) def panic(self, msg): self.log("client disconnected ({0})".format(msg).upper()) self.ok = False self.s.close() def read_header(self): ret = b"" while True: if ret.endswith(b"\r\n\r\n"): break elif ret.endswith(b"\r\n\r"): n = 1 elif ret.endswith(b"\r\n"): n = 2 elif ret.endswith(b"\r"): n = 3 else: n = 4 buf = self.sr.recv(n) if not buf: self.panic("headers") break ret += buf return ret[:-4].decode("utf-8", "replace").split("\r\n") def reply(self, body): header = "HTTP/1.1 200 OK\r\nConnection: Keep-Alive\r\nContent-Type: text/html\r\nContent-Length: {0}\r\n\r\n".format( len(body) ).encode( "utf-8" ) if self.ok: self.s.send(header + body) return body def loud_reply(self, body): self.log(body.rstrip()) self.reply(b"
" + body.encode("utf-8"))
def handle_get(self):
self.log("")
self.log("GET {0} {1}".format(self.addr[0], self.req))
self.reply(
b'