Keep on moving

あんまりまとまってないことを書きますよ

pyuvでHTTP client書いてみた

勉強のために、libuvのサンプルをいろいろ集めてます。
今日は mattnさんの書かれていたHTTP clientをpyuvで書いてみました。

ソース

import sys
import socket
import pyuv

def on_close(tcp_handle):
    print("[closed]")

def on_read(tcp_handle, data):
    print("[read]")
    if data is None:
        tcp_handle.close(on_close)
        return
    data = data.strip()
    if not data:
        return
    print(data)

def on_write(tcp_handle, status):
    print("[written]")
    tcp_handle.start_read(on_read)

def on_connection(tcp_handle, status):
    print("[connected]")
    data = "GET / HTTP/1.0\r\n\r\n"
    tcp_handle.write(data, on_write)

def main(host):
    print("[main]")
    loop = pyuv.Loop()
    client = pyuv.TCP(loop)
    ip = socket.gethostbyname(host)
    client.connect((ip, 80),on_connection)
    loop.run()

if __name__ == "__main__":
    print("PyUV version %s" % pyuv.__version__)
    main(sys.argv[1])
    print("Stopped!")

実行例

localhostに接続

$ python http_client.py localhost
PyUV version 0.2.0
[main]
[connected]
[written]
[read]
HTTP/1.1 200 OK
Server: nginx/1.0.11
Date: Mon, 26 Dec 2011 16:39:55 GMT
Content-Type: text/html
Content-Length: 151
Last-Modified: Mon, 04 Oct 2004 15:04:06 GMT
Connection: close
Accept-Ranges: bytes



Welcome to nginx!


< center>< h1>Welcome to nginx!< /h1>< /center>


[read]
[closed]
Stopped!

所感

コールバック関数をたくさん書かないと行けないのが結構めんどくさい気がする。
ここらへんもTornadoっぽいなー