Pythonの勉強にローカルプロキシ書いてみた。./cache/に読み込んだCSS/JS/IMG/HTMLデータをディレクトリ構造を再現してコピーする。ローカル保存スクリプトを兼ねてみた。
#eoncoding:shift_jis
import SimpleHTTPServer
import threading
import BaseHTTPServer
import select
import socket
import SocketServer
import urlparse
import urllib2
import os
import fileinput
Thread = threading.Thread
class HttpdThread(Thread):
def __init__(self):
self.httpd = Httpd( ("" ,8080), ProxyServer )
Thread.__init__(self)
def run(self):
self.httpd.serve_forever()
pass
def stop(self):
self.httpd.server_close()
pass
class Httpd(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
pass
class ProxyServer(BaseHTTPServer.BaseHTTPRequestHandler):
def do_CONNECT(self):
self.do_GET()
def do_GET(self):
code = self.header()
if( code < 300 ):
self.wfile.write( self.read() )
def do_POST(self):
self.do_GET()
def do_HEAD(self):
self.do_GET()
def _docBase(self):
return os.path.abspath(os.path.curdir)
def _hasLocalFile(self):
return os.path.lexists( self._localOverridePath() )
def _localOverridePath(self):
parsed = urlparse.urlparse(self.path)
return (os.path.abspath(os.path.curdir)
+ os.path.sep + "local"
+ os.path.sep+parsed[1]
+ parsed[2].replace("/", os.path.sep))
def _localCachePath(self):
parsed = urlparse.urlparse(self.path)
return (os.path.abspath(os.path.curdir)
+ os.path.sep + "cache"
+ os.path.sep+parsed[1]
+ parsed[2].replace("/", os.path.sep))
def _readLocalFile(self):
f = None
try:
f =file( self._localOverridePath() )
finally:
return f
def _writeLocalCache(self,content):
try:
# if mkdirs in os :
# os.mkdirs( os.path.dirname(self._localOverridePath()) )
# elif makedirs in os :
os.makedirs( os.path.dirname(self._localCachePath()) )
except:
""
finally:
import zlib
try:
content = zlib.decompress(content)
except:
""
try:
if self.res.info()["Content-type"].find("text") != -1 :
mode = "w"
else:
mode = "wb"
f = file( self._localCachePath(), mode )
f.write( content )
f.close()
except:
""
return True
def _makeLocalOverrideDir(self):
try:
# if mkdirs in os :
# os.mkdirs( os.path.dirname(self._localOverridePath()) )
# elif makedirs in os :
os.makedirs( os.path.dirname(self._localOverridePath()) )
except:
""
finally:
return True
def read(self):
content = self._readLocalFile()
if( content ):
return content.read()
else:
self._makeLocalOverrideDir()
data = self.res.read()
self._writeLocalCache(data)
return data
def header(self):
req = urllib2.Request( self.path )
for x in self.headers:
req.add_header( x, self.headers.getheader(x) )
code = "404"
hdr = None
try:
res = urllib2.urlopen(req)
code = res.code
hdr = res.info()
self.res = res
except HTTPError,e :
code = e.code
hdr = e.hdr
finally:
#response code
self.send_response( code, self.responses[code] )
for x in hdr:
self.send_header( x, hdr[x] )
self.end_headers()
return code
thr = HttpdThread()
thr.start()
困ったことに、urllib2で取り出したデータがgzipで圧縮されているのか、バイナリデータなんだ。。。どうしようか