コード例 #1
0
ファイル: http.py プロジェクト: ufwt/dizzy
class DizzySession(object):
    def __init__(self, section_proxy):
        self.dest = section_proxy.get('target_host')
        self.dport = section_proxy.getint('target_port', 80)
        self.src = section_proxy.get('source_host', '')
        self.src_str = self.src
        if self.src == '':
            self.src = None
        self.sport = section_proxy.getint('source_port', 80)
        self.method = section_proxy.get('method', 'GET')
        self.url = section_proxy.get('url')
        self.headers = {}
        headers = section_proxy.get('headers', '')
        if not headers == '':
            for l in headers.split(";"):
                r = l.split(":")
                self.headers[r[0]] = ":".join(r[1:])
        self.cookies = {}
        self.timeout = section_proxy.getfloat('timeout', 1)
        self.auto_reopen = section_proxy.getboolean('auto_reopen', True)
        self.retry = section_proxy.getint('retry', 3)
        self.server_side = section_proxy.getboolean('server', False)
        self.read_first = self.server_side
        self.read_first = section_proxy.getboolean('read_first',
                                                   self.read_first)
        self.is_open = False
        self.res = None
        self.thread = None
        self.send_lock = Lock()
        self.recv_lock = Lock()
        self.rlist = []
        self.slist = []

        class DizzyHTTPRequestHandler(BaseHTTPRequestHandler):
            dest = self.dest
            dport = self.dport
            send_lock = self.send_lock
            recv_lock = self.recv_lock
            rlist = self.rlist
            slist = self.slist
            set_headers = self.headers
            protocol_version = "HTTP/1.1"

            def all_methods(self):
                (addr, port) = self.client_address
                if addr == self.dest:
                    print_dizzy(
                        "http/request_handler: handling request from %s" %
                        addr, VERBOSE_2)
                    while True and not self.server._BaseServer__shutdown_request:
                        with self.recv_lock:
                            if len(self.rlist) == 0:
                                break
                        print_dizzy("http/request_handler: rlist not empty",
                                    DEBUG)
                        sleep(0.1)
                    with self.recv_lock:
                        length = int(self.headers['content-length'])
                        self.rlist.append(self.rfile.read(length))
                    while True and not self.server._BaseServer__shutdown_request:
                        with self.send_lock:
                            if len(self.slist) == 1:
                                break
                        print_dizzy("http/request_handler: slist empty", DEBUG)
                        sleep(0.1)
                    with self.send_lock:
                        data = self.slist.pop()
                        self.send_response(200)
                        for i in self.set_headers:
                            self.send_header(i, self.set_headers[i])
                        self.send_header('Content-Length', len(data))
                        self.end_headers()
                        self.wfile.write(data)
                else:
                    print_dizzy(
                        "http/request_handler: denied access for %s" % addr,
                        VERBOSE_2)

            def log_message(self, format, *args):
                return

            do_GET = all_methods
            do_HEAD = all_methods
            do_POST = all_methods
            do_PUT = all_methods
            do_DELETE = all_methods
            do_CONNECT = all_methods
            do_OPTIONS = all_methods
            do_TRACE = all_methods
            do_PATCH = all_methods

        self.request_handler = DizzyHTTPRequestHandler

    def open(self):
        try:
            if not self.server_side:
                self.connection = HTTPConnection(self.dest,
                                                 self.dport,
                                                 timeout=self.timeout,
                                                 source_address=self.src)
            else:
                attempt = 0
                while attempt < self.retry:
                    try:
                        self.connection = HTTPServer(
                            (self.src_str, self.sport), self.request_handler)
                    except OSError:
                        attempt += 1
                        sleep(1)
                        continue
                    else:
                        break

                self.thread = DizzyHTTPServerThread(self.connection)
                self.thread.start()
        except Exception as e:
            raise SessionException("http/open: cant open session: %s" % e)
        else:
            self.is_open = True

    def close(self):
        if not self.is_open:
            return
        if not self.server_side:
            self.connection.close()
            self.res = None
        else:
            self.connection.shutdown()
        self.is_open = False

    def send(self, data):
        try:
            if not self.server_side:
                headers = self.headers
                cookies = ";".join(
                    ["%s=%s" % (n, v) for (n, v) in self.cookies.items()])
                if len(cookies) > 0:
                    headers.update({"Cookie": cookies})
                self.connection.request(self.method,
                                        self.url,
                                        body=data,
                                        headers=headers)
                self.res = self.connection.getresponse()
                headers = dict(self.res.getheaders())
                for h in headers:
                    if h == "Set-Cookie":
                        try:
                            nv = headers[h].split(";")[0].split("=")
                            self.cookies[nv[0]] = nv[1]
                        except:
                            print_dizzy(
                                "http/send: failed to parse set-cookie: %s" %
                                headers[h], VERBOSE_1)
            else:
                while True:
                    with self.send_lock:
                        if len(self.slist) == 0:
                            break
                    print_dizzy("http/send: slist not empty", DEBUG)
                    sleep(0.1)
                with self.send_lock:
                    self.slist.append(data)
                    print_dizzy("http/send: pushed %s" % data, DEBUG)
        except Exception as e:
            if self.auto_reopen:
                print_dizzy(
                    "http/send: session got closed '%s', auto reopening..." %
                    e, DEBUG)
                print_dizzy(e, DEBUG)
                self.close()
                self.open()
            else:
                self.close()
                raise SessionException(
                    "http/send: error on sending '%s', connection closed." % e)

    def recv(self):
        #from traceback import print_stack
        #print_stack()

        if not self.server_side:
            if not self.res is None:
                return self.res.read()
        else:
            while True:
                with self.recv_lock:
                    if len(self.rlist) == 1:
                        break
                print_dizzy("http/recv: rlist empty", DEBUG)
                sleep(0.1)
            with self.recv_lock:
                data = self.rlist.pop()
                print_dizzy("http/recv: poped %s" % data, DEBUG)
                return data
コード例 #2
0
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse, parse_qs

host_name = "localhost"
port = 8443


class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        queries = parse_qs(urlparse(self.path).query)
        print(
            f"Username {queries['user'][0]}, Password {queries['password'][0]}"
        )
        self.send_response(300)
        self.send_header("Location", "http://google.com")
        self.end_headers()


if __name__ == "__main__":
    web_server = HTTPServer((host_name, port), MyServer)
    print(f"server started: http://{host_name}:{port}")
    try:
        web_server.serve_forever()
    except KeyboardInterrupt:
        pass

    web_server.close()
    print("Webserver eneded")