解析来自SimpleHTTPServer的GET请求数据



所以我在8000端口的Ubuntu机器上创建了一个简单的服务器:

python -m SimpleHTTPServer

10.127.11.18 - - [14/Aug/2014 15:11:55] "GET / HTTP/1.1" 200 -
10.127.11.18 - - [14/Aug/2014 15:11:55] code 404, message File not found
10.127.11.18 - - [14/Aug/2014 15:11:55] "GET /favicon.ico HTTP/1.1" 404 -
10.127.11.18 - - [14/Aug/2014 15:12:02] "GET /crazysean/ HTTP/1.1" 200 -
10.127.11.18 - - [14/Aug/2014 15:12:37] "GET /crazysean/ HTTP/1.1" 200 -
10.127.11.18 - - [14/Aug/2014 15:12:52] "GET /crazysean/?url=www.google.com&x=200&y=400 HTTP/1.1" 301 -
10.127.11.18 - - [14/Aug/2014 15:12:52] "GET /crazysean/?url=www.google.com&x=200&y=400/ HTTP/1.1" 200 -
10.127.11.18 - - [14/Aug/2014 15:13:10] "GET /crazysean/?url=www.google.com&x=200&y=400/ HTTP/1.1" 200 -

我正在尝试解析发送的GET数据,如URL, x位置和y位置。

我假设我的第一步应该是创建一个新的脚本,像这样:

import SimpleHTTPServer
import SocketServer
PORT = 8000
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "serving at port", PORT
httpd.serve_forever()

但是我不确定如何修改这个脚本来捕获GET数据,因为最终我想将数据转储到sqlite3 db.

认为这是一个XY问题。您对解析GET请求或对日志做任何事情都不感兴趣;您想要的是"捕获GET数据",与SimpleHTTPServer使用该数据为请求服务的方式完全相同,因此您可以将其存储在数据库中。你只是认为唯一的方法就是解析一些东西某处,但是你不确定是什么。

显然,SimpleHTTPServer必须已经在解析GET数据,并且必须有您想要的可用数据。那么,它在哪里?

正如文档顶部所说的:

许多工作,如解析请求,是由基类BaseHTTPServer.BaseHTTPRequestHandler完成的。该类实现了do_GET()do_HEAD()函数。

点击链接,你会看到:

处理程序将解析请求和报头,然后调用特定于请求类型的方法。方法名是根据请求构造的。例如,对于请求方法SPAM,将不带参数调用do_SPAM()方法。所有相关信息都存储在处理程序的实例变量中…

所以,所有东西都被解析为实例变量;下面这段话下面有一个很好的列表。

:

class DBLoggingHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super(DBLoggingHandler, self).__init__(*args, **kwargs)
        self.db = sqlite3.connect(dbpath)
    def do_GET(self):
        self.db.execute("INSERT INTO GetLog (command, vers, path) VALUES (?, ?, ?)",
                        (self.command, self.request_version, self.path))
        return super(DBLoggingHandler, self).do_GET()

如果您想将path解析为单独的组件,您可以使用urlparse:

    def do_GET(self):
        bits = urlparse.urlpase(self.path)
        self.db.execute("""INSERT INTO GetLog (command, vers, scheme, netloc, 
                                               path, params, query, fragment,
                                               username, password, hostname, port)
                           VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
                        (self.command, self.request_version, bits.scheme, bits.netloc,
                         bits.path, bits.params, bits.query, bits.fragment,
                         bits.username, bits.password, bits.hostname, bits.port))
        return super(DBLoggingHandler, self).do_GET()

另外,请记住请求可以有不止一个命令行;它们通常有标题,它们可能有一个主体(尽管通常不是GET)。参见headersrfile。对于不是HTTP请求的一部分,而是套接字连接的一部分的信息,或者关于服务器的信息,等等,也有属性。

相关内容

  • 没有找到相关文章

最新更新