[Python-ml-jp 597] Re: TinyHTTPProxy 0.1

SUZUKI Hisao suzuki @ acm.org
2001年 9月 22日 (土) 14:38:55 JST


鈴木です
[Python-ml-jp 596] の TinyHTTPProxy 0.1 について

>標準ライブラリの BaseHTTPServer を応用して HTTP プロキシを書いてみました。
[snip]
>alarm を使わないように作れば Windows 上でも動作すると思います。

Ver. 0.1 の名にたがわず(?)バグが見つかりました >_<
接続開始のタイムアウトを alarm でしているのはよいのですが,
なまじマルチスレッドにしたため,Timeout 例外が当該スレッドに
いかなくなっていました。
# python ではシグナルはすべてメインスレッドが受けます。

ただし,BeOS ではどのみちシグナル受信時にシステムコールが中断されるため,
Web ブラウザに対する接続も切断されますから,さしあたり実害はありません。

02:~/suh/pitono# ./TinyHTTPProxy.py 4004
Serving HTTP on port 4004 ...
        connect to urso 80
        bye
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/boot/home/config/lib/python2.1/threading.py", line 378, in __bootstrap
[snip]
  File "./TinyHTTPProxy.py", line 31, in connect_to
    sock.connect((host, port))
  File "<string>", line 1, in connect
error: (-2147483638, 'Interrupted system call')

これは System V 系の Unix も同じはずだったです。一方,BSD 系 Unix では
デフォルトでシステムコールはシグナル受信後自動再開されたと思いますから,
そのまま待ちぼうけになってしまうかもしれません *_*;

応急措置として,プログラム末尾の

>class ThreadingHTTPServer (SocketServer.ThreadingMixIn,
>                           BaseHTTPServer.HTTPServer): pass

の SocketServer.ThreadingMixIn, の頭に # をつけてコメントアウトすれば,
シングルスレッドになりますが,きちんとタイムアウト処理されます。

02:~/suh/pitono# ./TinyHTTPProxy-ex.py 4004   
Serving HTTP on port 4004 ...
        connect to urso 80
medve - - [22/Sep/2001 13:35:49] code 504, message proxy has timed out
medve - - [22/Sep/2001 13:35:49] "GET http://urso/ HTTP/1.0" 504 -
        bye

# で,Ver. 0.2 はもう少しお待ちください m(_ _)m
--
SUZUKI Hisao          >>> def fib(n): return reduce(lambda x, y:
suzuki @ acm.org        ... (x,x[0][-1]+x[1]), [()]*n, ((0L,),1L))





Python-ml-jp メーリングリストの案内