import mercurial.url
import re
+import os
class Webconn:
def __init__(self, mnt, req):
+ while True:
+ try:
+ self.open(mnt, req)
+ return
+ except IOError, e:
+ try:
+ errstr = e.strerror
+ params = errstr[errstr.index("needkey ")+8:]
+ if params.find("!password?") < 0:
+ raise e
+ if os.spawnl(os.P_WAIT, "/boot/factotum", "getkey", "-g", params) != 0:
+ raise e
+ except:
+ raise e
+
+ def open(self, mnt, req):
+ if type(req) == str:
+ self.url = req
+ else:
+ self.url = req.get_full_url()
+ if self.url[0:5] == 'file:':
+ path = self.url[5:]
+ while path[0:2] == '//':
+ path = path[1:]
+ self.dir = '/dev/null'
+ self.body = open(path, 'r', 0)
+ return
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)
+ m = 'User-Agent: mercurial/proto-1.0\r\n';
+ for h in req.headers:
+ m += h+': '+req.headers[h]+'\r\n'
+ ctl.seek(0)
+ ctl.write('headers '+m)
if req.has_data():
data = req.get_data()
- post = open(self.dir+'/postdata', 'w', 0);
+ post = open(self.dir+'/postbody', 'w', 0);
try:
+ data.seek(0)
while True:
buf = data.read(4096)
if len(buf) == 0:
def __init__(self):
self.handlers = []
+ def add_handler(self, handler):
+ return
+
def open(self, req, data=None):
return Webconn('/mnt/web', req)
def webopener(ui, authinfo=None):
return Webopener();
+mercurial.url.has_https = 1
mercurial.url.opener = webopener