75 lines
1.3 KiB
Python
75 lines
1.3 KiB
Python
|
''' webfs support '''
|
||
|
|
||
|
import mercurial.url
|
||
|
import re
|
||
|
|
||
|
class Webconn:
|
||
|
def __init__(self, mnt, req):
|
||
|
ctl = open(mnt+'/clone', 'r+', 0)
|
||
|
try:
|
||
|
self.url = req.get_full_url()
|
||
|
self.dir = mnt+'/'+ctl.readline().rstrip('\n')
|
||
|
ctl.seek(0)
|
||
|
ctl.write('url '+self.url)
|
||
|
m = ''
|
||
|
for h,v in req.headers:
|
||
|
m += h+': '+v+'\r\n'
|
||
|
if len(m) > 0:
|
||
|
m = 'headers '+m
|
||
|
print m
|
||
|
ctl.seek(0)
|
||
|
ctl.write(m)
|
||
|
if req.has_data():
|
||
|
data = req.get_data()
|
||
|
post = open(self.dir+'/postdata', 'w', 0);
|
||
|
try:
|
||
|
while True:
|
||
|
buf = data.read(4096)
|
||
|
if len(buf) == 0:
|
||
|
break
|
||
|
post.write(buf)
|
||
|
finally:
|
||
|
post.close()
|
||
|
self.body = open(self.dir+'/body', 'r', 0)
|
||
|
finally:
|
||
|
ctl.close()
|
||
|
|
||
|
def read(self, amt=4096):
|
||
|
return self.body.read(amt);
|
||
|
|
||
|
def close(self):
|
||
|
self.body.close()
|
||
|
self.body = None
|
||
|
self.dir = None
|
||
|
|
||
|
def geturl(self):
|
||
|
return self.url
|
||
|
|
||
|
def getheader(self, key):
|
||
|
name = re.sub(r'[^a-z]+', '', key.lower())
|
||
|
try:
|
||
|
f = open(self.dir+'/'+name, 'r', 0)
|
||
|
try:
|
||
|
hdr = f.read()
|
||
|
finally:
|
||
|
f.close()
|
||
|
return hdr
|
||
|
except:
|
||
|
return None
|
||
|
|
||
|
class Webopener:
|
||
|
def __init__(self):
|
||
|
self.handlers = []
|
||
|
|
||
|
def open(self, req, data=None):
|
||
|
return Webconn('/mnt/web', req)
|
||
|
|
||
|
def close(self):
|
||
|
pass
|
||
|
|
||
|
|
||
|
def webopener(ui, authinfo=None):
|
||
|
return Webopener();
|
||
|
|
||
|
mercurial.url.opener = webopener
|