TopCoderプロキシ

TopCoderのArenaはJavaWebStartで、www.topcoder.com:80からソフトウェアをダウンロードした後www.topcoder.com:5001にアクセスをする。というわけでwww.topcoder.comは普段は66.37.210.86。というわけでhostsを書き換えてwww.topcoder.comが127.0.0.1を指すようにした上でローカルで下のようなスクリプトを起動。

(削除されました)

これでTopCoderのサイトからJavaWebStartで起動するところまではうまくいくのだけど、ログインをしようとするとタイムアウトになる。なんでだろうなぁ。

出力は
(削除されました)
って感じなので、サーバの返答を受信して、返事が来ないから全部受信し終わったと考えてクローズしているところが実は焦りすぎということなんだろうか。

        • -

あ、そっか。HTTPと違うからサーバに送って、サーバから返事が返ってきても終わりじゃないんだ。そこでcloseしちゃダメだな。

got result, len 31
sending result
sent result
getting result
timeout('timed out',)
----------
getting data
got data, len 41
sending data
sent data
getting data

やっぱりそうだった。しかし、じゃぁどういうときにcloseすればいいんだろうか。

        • -

とりあえず、他の人の書いたファイルをダウンロードできるようになった。

"""
topcoder proxy
"""

import SocketServer

class ProxyHandler(SocketServer.StreamRequestHandler):
    PORT = 5001
    def handle(self):
        print "connect from:", self.client_address
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        print "connecting to TopCoder"
        s.connect(("66.37.210.86", self.PORT))
        print "connected to TopCoder"
        from time import sleep
        TO_CLOSE = False
        while not TO_CLOSE:
            try:
                while True:
                    print "getting data",
                    data = self.request.recv(8192)
                    print "got data, len", len(data)
                    if len(data) == 0:
                        TO_CLOSE = True
                        break
                    print "sending data",
                    s.send(data)
                    print "sent data"
            except Exception, e:
                print repr(e)
                
            try:
                while True:
                    print "getting result",
                    result = s.recv(8192)
                    print "got result, len", len(result)
                    if len(result) == 0:
                        TO_CLOSE = True
                        break
                    if "#include" in result:
                        print "code found!"
                        start = result.index("#include")
                        end = result.index("\x00", start)
                        import time
                        filename = time.strftime(
                            r"C:\topcoder\dl\%m%d_%H%M%S.cpp")
                        file(filename, "w").write(result[start:end])
                    
                    print "sending result",
                    self.request.send(result)
                    print "sent result"
            except Exception, e:
                print repr(e)
            print "----------"
            sleep(1)
            

        s.close()
        self.request.close()

class ProxyHandler80(ProxyHandler):
    PORT = 80

import thread
import socket
socket.setdefaulttimeout(1.0)

server = SocketServer.ThreadingTCPServer(('localhost', 5001), ProxyHandler)
print 'listening:', server.socket.getsockname()
thread.start_new_thread(server.serve_forever, ())

server = SocketServer.ThreadingTCPServer(('localhost', 80), ProxyHandler80)
print 'listening:', server.socket.getsockname()
thread.start_new_thread(server.serve_forever, ())