1

そこで、次のようにして、ポート 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 -

GETURL、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 にダンプしたいので、データをキャプチャするためにこのスクリプトを修正する方法がわかりません。

4

1 に答える 1

5

これはXYの問題だと思います。GET リクエストを解析したり、ログを処理したりすることに関心はありません。必要なのは、そのデータを使用してリクエストを処理するのとまったく同じ方法で「GETデータをキャプチャする」SimpleHTTPServerことであり、データベースに保存できます。そして、それを行う唯一の方法は、何かどこかを解析することだと思っていましたが、何がわからなかったのですか。

明らかに、SimpleHTTPServerすでにデータを解析しているGET必要があり、必要なものを正確に利用できる必要があります。それで、それはどこですか?

ドキュメントが一番上にあるように:

リクエストの解析など、多くの作業は基本クラスによって行われBaseHTTPServer.BaseHTTPRequestHandlerます。このクラスはdo_GET()およびdo_HEAD()関数を実装します。

そのリンクをたどると、次のことがわかります。

ハンドラーはリクエストとヘッダーを解析し、リクエスト タイプに固有のメソッドを呼び出します。メソッド名はリクエストから作成されます。たとえば、リクエスト メソッドSPAMの場合、do_SPAM()メソッドは引数なしで呼び出されます。関連するすべての情報は、ハンドラーのインスタンス変数に保存されます…</p>

したがって、すべてがインスタンス変数に解析されました。その下の段落の下にそれらの素晴らしいリストがあります。

そう:

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 要求の一部ではなく、ソケット接続の一部である情報、またはサーバーに関する情報などについても、その属性があります。

于 2014-08-14T19:45:54.947 に答える