##// END OF EJS Templates
httprepo: order URL query string fields for readability...
Steven Brown -
r13555:970150dd default
parent child Browse files
Show More
@@ -1,203 +1,202 b''
1 # httprepo.py - HTTP repository proxy classes for mercurial
1 # httprepo.py - HTTP repository proxy classes for mercurial
2 #
2 #
3 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
4 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
4 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
5 #
5 #
6 # This software may be used and distributed according to the terms of the
6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version.
7 # GNU General Public License version 2 or any later version.
8
8
9 from node import nullid
9 from node import nullid
10 from i18n import _
10 from i18n import _
11 import changegroup, statichttprepo, error, url, util, wireproto
11 import changegroup, statichttprepo, error, url, util, wireproto
12 import os, urllib, urllib2, urlparse, zlib, httplib
12 import os, urllib, urllib2, urlparse, zlib, httplib
13 import errno, socket
13 import errno, socket
14
14
15 def zgenerator(f):
15 def zgenerator(f):
16 zd = zlib.decompressobj()
16 zd = zlib.decompressobj()
17 try:
17 try:
18 for chunk in util.filechunkiter(f):
18 for chunk in util.filechunkiter(f):
19 while chunk:
19 while chunk:
20 yield zd.decompress(chunk, 2**18)
20 yield zd.decompress(chunk, 2**18)
21 chunk = zd.unconsumed_tail
21 chunk = zd.unconsumed_tail
22 except httplib.HTTPException:
22 except httplib.HTTPException:
23 raise IOError(None, _('connection ended unexpectedly'))
23 raise IOError(None, _('connection ended unexpectedly'))
24 yield zd.flush()
24 yield zd.flush()
25
25
26 class httprepository(wireproto.wirerepository):
26 class httprepository(wireproto.wirerepository):
27 def __init__(self, ui, path):
27 def __init__(self, ui, path):
28 self.path = path
28 self.path = path
29 self.caps = None
29 self.caps = None
30 self.handler = None
30 self.handler = None
31 scheme, netloc, urlpath, query, frag = urlparse.urlsplit(path)
31 scheme, netloc, urlpath, query, frag = urlparse.urlsplit(path)
32 if query or frag:
32 if query or frag:
33 raise util.Abort(_('unsupported URL component: "%s"') %
33 raise util.Abort(_('unsupported URL component: "%s"') %
34 (query or frag))
34 (query or frag))
35
35
36 # urllib cannot handle URLs with embedded user or passwd
36 # urllib cannot handle URLs with embedded user or passwd
37 self._url, authinfo = url.getauthinfo(path)
37 self._url, authinfo = url.getauthinfo(path)
38
38
39 self.ui = ui
39 self.ui = ui
40 self.ui.debug('using %s\n' % self._url)
40 self.ui.debug('using %s\n' % self._url)
41
41
42 self.urlopener = url.opener(ui, authinfo)
42 self.urlopener = url.opener(ui, authinfo)
43
43
44 def __del__(self):
44 def __del__(self):
45 for h in self.urlopener.handlers:
45 for h in self.urlopener.handlers:
46 h.close()
46 h.close()
47 if hasattr(h, "close_all"):
47 if hasattr(h, "close_all"):
48 h.close_all()
48 h.close_all()
49
49
50 def url(self):
50 def url(self):
51 return self.path
51 return self.path
52
52
53 # look up capabilities only when needed
53 # look up capabilities only when needed
54
54
55 def get_caps(self):
55 def get_caps(self):
56 if self.caps is None:
56 if self.caps is None:
57 try:
57 try:
58 self.caps = set(self._call('capabilities').split())
58 self.caps = set(self._call('capabilities').split())
59 except error.RepoError:
59 except error.RepoError:
60 self.caps = set()
60 self.caps = set()
61 self.ui.debug('capabilities: %s\n' %
61 self.ui.debug('capabilities: %s\n' %
62 (' '.join(self.caps or ['none'])))
62 (' '.join(self.caps or ['none'])))
63 return self.caps
63 return self.caps
64
64
65 capabilities = property(get_caps)
65 capabilities = property(get_caps)
66
66
67 def lock(self):
67 def lock(self):
68 raise util.Abort(_('operation not supported over http'))
68 raise util.Abort(_('operation not supported over http'))
69
69
70 def _callstream(self, cmd, **args):
70 def _callstream(self, cmd, **args):
71 if cmd == 'pushkey':
71 if cmd == 'pushkey':
72 args['data'] = ''
72 args['data'] = ''
73 data = args.pop('data', None)
73 data = args.pop('data', None)
74 headers = args.pop('headers', {})
74 headers = args.pop('headers', {})
75 self.ui.debug("sending %s command\n" % cmd)
75 self.ui.debug("sending %s command\n" % cmd)
76 q = {"cmd": cmd}
76 q = [('cmd', cmd)] + sorted(args.items())
77 q.update(args)
78 qs = '?%s' % urllib.urlencode(q)
77 qs = '?%s' % urllib.urlencode(q)
79 cu = "%s%s" % (self._url, qs)
78 cu = "%s%s" % (self._url, qs)
80 req = urllib2.Request(cu, data, headers)
79 req = urllib2.Request(cu, data, headers)
81 if data is not None:
80 if data is not None:
82 # len(data) is broken if data doesn't fit into Py_ssize_t
81 # len(data) is broken if data doesn't fit into Py_ssize_t
83 # add the header ourself to avoid OverflowError
82 # add the header ourself to avoid OverflowError
84 size = data.__len__()
83 size = data.__len__()
85 self.ui.debug("sending %s bytes\n" % size)
84 self.ui.debug("sending %s bytes\n" % size)
86 req.add_unredirected_header('Content-Length', '%d' % size)
85 req.add_unredirected_header('Content-Length', '%d' % size)
87 try:
86 try:
88 resp = self.urlopener.open(req)
87 resp = self.urlopener.open(req)
89 except urllib2.HTTPError, inst:
88 except urllib2.HTTPError, inst:
90 if inst.code == 401:
89 if inst.code == 401:
91 raise util.Abort(_('authorization failed'))
90 raise util.Abort(_('authorization failed'))
92 raise
91 raise
93 except httplib.HTTPException, inst:
92 except httplib.HTTPException, inst:
94 self.ui.debug('http error while sending %s command\n' % cmd)
93 self.ui.debug('http error while sending %s command\n' % cmd)
95 self.ui.traceback()
94 self.ui.traceback()
96 raise IOError(None, inst)
95 raise IOError(None, inst)
97 except IndexError:
96 except IndexError:
98 # this only happens with Python 2.3, later versions raise URLError
97 # this only happens with Python 2.3, later versions raise URLError
99 raise util.Abort(_('http error, possibly caused by proxy setting'))
98 raise util.Abort(_('http error, possibly caused by proxy setting'))
100 # record the url we got redirected to
99 # record the url we got redirected to
101 resp_url = resp.geturl()
100 resp_url = resp.geturl()
102 if resp_url.endswith(qs):
101 if resp_url.endswith(qs):
103 resp_url = resp_url[:-len(qs)]
102 resp_url = resp_url[:-len(qs)]
104 if self._url.rstrip('/') != resp_url.rstrip('/'):
103 if self._url.rstrip('/') != resp_url.rstrip('/'):
105 self.ui.status(_('real URL is %s\n') % resp_url)
104 self.ui.status(_('real URL is %s\n') % resp_url)
106 self._url = resp_url
105 self._url = resp_url
107 try:
106 try:
108 proto = resp.getheader('content-type')
107 proto = resp.getheader('content-type')
109 except AttributeError:
108 except AttributeError:
110 proto = resp.headers['content-type']
109 proto = resp.headers['content-type']
111
110
112 safeurl = url.hidepassword(self._url)
111 safeurl = url.hidepassword(self._url)
113 # accept old "text/plain" and "application/hg-changegroup" for now
112 # accept old "text/plain" and "application/hg-changegroup" for now
114 if not (proto.startswith('application/mercurial-') or
113 if not (proto.startswith('application/mercurial-') or
115 proto.startswith('text/plain') or
114 proto.startswith('text/plain') or
116 proto.startswith('application/hg-changegroup')):
115 proto.startswith('application/hg-changegroup')):
117 self.ui.debug("requested URL: '%s'\n" % url.hidepassword(cu))
116 self.ui.debug("requested URL: '%s'\n" % url.hidepassword(cu))
118 raise error.RepoError(
117 raise error.RepoError(
119 _("'%s' does not appear to be an hg repository:\n"
118 _("'%s' does not appear to be an hg repository:\n"
120 "---%%<--- (%s)\n%s\n---%%<---\n")
119 "---%%<--- (%s)\n%s\n---%%<---\n")
121 % (safeurl, proto, resp.read()))
120 % (safeurl, proto, resp.read()))
122
121
123 if proto.startswith('application/mercurial-'):
122 if proto.startswith('application/mercurial-'):
124 try:
123 try:
125 version = proto.split('-', 1)[1]
124 version = proto.split('-', 1)[1]
126 version_info = tuple([int(n) for n in version.split('.')])
125 version_info = tuple([int(n) for n in version.split('.')])
127 except ValueError:
126 except ValueError:
128 raise error.RepoError(_("'%s' sent a broken Content-Type "
127 raise error.RepoError(_("'%s' sent a broken Content-Type "
129 "header (%s)") % (safeurl, proto))
128 "header (%s)") % (safeurl, proto))
130 if version_info > (0, 1):
129 if version_info > (0, 1):
131 raise error.RepoError(_("'%s' uses newer protocol %s") %
130 raise error.RepoError(_("'%s' uses newer protocol %s") %
132 (safeurl, version))
131 (safeurl, version))
133
132
134 return resp
133 return resp
135
134
136 def _call(self, cmd, **args):
135 def _call(self, cmd, **args):
137 fp = self._callstream(cmd, **args)
136 fp = self._callstream(cmd, **args)
138 try:
137 try:
139 return fp.read()
138 return fp.read()
140 finally:
139 finally:
141 # if using keepalive, allow connection to be reused
140 # if using keepalive, allow connection to be reused
142 fp.close()
141 fp.close()
143
142
144 def _callpush(self, cmd, cg, **args):
143 def _callpush(self, cmd, cg, **args):
145 # have to stream bundle to a temp file because we do not have
144 # have to stream bundle to a temp file because we do not have
146 # http 1.1 chunked transfer.
145 # http 1.1 chunked transfer.
147
146
148 type = ""
147 type = ""
149 types = self.capable('unbundle')
148 types = self.capable('unbundle')
150 # servers older than d1b16a746db6 will send 'unbundle' as a
149 # servers older than d1b16a746db6 will send 'unbundle' as a
151 # boolean capability
150 # boolean capability
152 try:
151 try:
153 types = types.split(',')
152 types = types.split(',')
154 except AttributeError:
153 except AttributeError:
155 types = [""]
154 types = [""]
156 if types:
155 if types:
157 for x in types:
156 for x in types:
158 if x in changegroup.bundletypes:
157 if x in changegroup.bundletypes:
159 type = x
158 type = x
160 break
159 break
161
160
162 tempname = changegroup.writebundle(cg, None, type)
161 tempname = changegroup.writebundle(cg, None, type)
163 fp = url.httpsendfile(self.ui, tempname, "rb")
162 fp = url.httpsendfile(self.ui, tempname, "rb")
164 headers = {'Content-Type': 'application/mercurial-0.1'}
163 headers = {'Content-Type': 'application/mercurial-0.1'}
165
164
166 try:
165 try:
167 try:
166 try:
168 r = self._call(cmd, data=fp, headers=headers, **args)
167 r = self._call(cmd, data=fp, headers=headers, **args)
169 return r.split('\n', 1)
168 return r.split('\n', 1)
170 except socket.error, err:
169 except socket.error, err:
171 if err.args[0] in (errno.ECONNRESET, errno.EPIPE):
170 if err.args[0] in (errno.ECONNRESET, errno.EPIPE):
172 raise util.Abort(_('push failed: %s') % err.args[1])
171 raise util.Abort(_('push failed: %s') % err.args[1])
173 raise util.Abort(err.args[1])
172 raise util.Abort(err.args[1])
174 finally:
173 finally:
175 fp.close()
174 fp.close()
176 os.unlink(tempname)
175 os.unlink(tempname)
177
176
178 def _abort(self, exception):
177 def _abort(self, exception):
179 raise exception
178 raise exception
180
179
181 def _decompress(self, stream):
180 def _decompress(self, stream):
182 return util.chunkbuffer(zgenerator(stream))
181 return util.chunkbuffer(zgenerator(stream))
183
182
184 class httpsrepository(httprepository):
183 class httpsrepository(httprepository):
185 def __init__(self, ui, path):
184 def __init__(self, ui, path):
186 if not url.has_https:
185 if not url.has_https:
187 raise util.Abort(_('Python support for SSL and HTTPS '
186 raise util.Abort(_('Python support for SSL and HTTPS '
188 'is not installed'))
187 'is not installed'))
189 httprepository.__init__(self, ui, path)
188 httprepository.__init__(self, ui, path)
190
189
191 def instance(ui, path, create):
190 def instance(ui, path, create):
192 if create:
191 if create:
193 raise util.Abort(_('cannot create new http repository'))
192 raise util.Abort(_('cannot create new http repository'))
194 try:
193 try:
195 if path.startswith('https:'):
194 if path.startswith('https:'):
196 inst = httpsrepository(ui, path)
195 inst = httpsrepository(ui, path)
197 else:
196 else:
198 inst = httprepository(ui, path)
197 inst = httprepository(ui, path)
199 inst.between([(nullid, nullid)])
198 inst.between([(nullid, nullid)])
200 return inst
199 return inst
201 except error.RepoError:
200 except error.RepoError:
202 ui.note('(falling back to static-http)\n')
201 ui.note('(falling back to static-http)\n')
203 return statichttprepo.instance(ui, "static-" + path, create)
202 return statichttprepo.instance(ui, "static-" + path, create)
@@ -1,124 +1,124 b''
1
1
2 $ hg init a
2 $ hg init a
3 $ cd a
3 $ cd a
4 $ echo a > a
4 $ echo a > a
5 $ hg ci -Ama -d '1123456789 0'
5 $ hg ci -Ama -d '1123456789 0'
6 adding a
6 adding a
7 $ hg --config server.uncompressed=True serve -p $HGPORT -d --pid-file=hg.pid
7 $ hg --config server.uncompressed=True serve -p $HGPORT -d --pid-file=hg.pid
8 $ cat hg.pid >> $DAEMON_PIDS
8 $ cat hg.pid >> $DAEMON_PIDS
9 $ cd ..
9 $ cd ..
10 $ ("$TESTDIR/tinyproxy.py" $HGPORT1 localhost >proxy.log 2>&1 </dev/null &
10 $ ("$TESTDIR/tinyproxy.py" $HGPORT1 localhost >proxy.log 2>&1 </dev/null &
11 $ echo $! > proxy.pid)
11 $ echo $! > proxy.pid)
12 $ cat proxy.pid >> $DAEMON_PIDS
12 $ cat proxy.pid >> $DAEMON_PIDS
13 $ sleep 2
13 $ sleep 2
14
14
15 url for proxy, stream
15 url for proxy, stream
16
16
17 $ http_proxy=http://localhost:$HGPORT1/ hg --config http_proxy.always=True clone --uncompressed http://localhost:$HGPORT/ b
17 $ http_proxy=http://localhost:$HGPORT1/ hg --config http_proxy.always=True clone --uncompressed http://localhost:$HGPORT/ b
18 streaming all changes
18 streaming all changes
19 3 files to transfer, 303 bytes of data
19 3 files to transfer, 303 bytes of data
20 transferred * bytes in * seconds (*B/sec) (glob)
20 transferred * bytes in * seconds (*B/sec) (glob)
21 updating to branch default
21 updating to branch default
22 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
22 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
23 $ cd b
23 $ cd b
24 $ hg verify
24 $ hg verify
25 checking changesets
25 checking changesets
26 checking manifests
26 checking manifests
27 crosschecking files in changesets and manifests
27 crosschecking files in changesets and manifests
28 checking files
28 checking files
29 1 files, 1 changesets, 1 total revisions
29 1 files, 1 changesets, 1 total revisions
30 $ cd ..
30 $ cd ..
31
31
32 url for proxy, pull
32 url for proxy, pull
33
33
34 $ http_proxy=http://localhost:$HGPORT1/ hg --config http_proxy.always=True clone http://localhost:$HGPORT/ b-pull
34 $ http_proxy=http://localhost:$HGPORT1/ hg --config http_proxy.always=True clone http://localhost:$HGPORT/ b-pull
35 requesting all changes
35 requesting all changes
36 adding changesets
36 adding changesets
37 adding manifests
37 adding manifests
38 adding file changes
38 adding file changes
39 added 1 changesets with 1 changes to 1 files
39 added 1 changesets with 1 changes to 1 files
40 updating to branch default
40 updating to branch default
41 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
41 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
42 $ cd b-pull
42 $ cd b-pull
43 $ hg verify
43 $ hg verify
44 checking changesets
44 checking changesets
45 checking manifests
45 checking manifests
46 crosschecking files in changesets and manifests
46 crosschecking files in changesets and manifests
47 checking files
47 checking files
48 1 files, 1 changesets, 1 total revisions
48 1 files, 1 changesets, 1 total revisions
49 $ cd ..
49 $ cd ..
50
50
51 host:port for proxy
51 host:port for proxy
52
52
53 $ http_proxy=localhost:$HGPORT1 hg clone --config http_proxy.always=True http://localhost:$HGPORT/ c
53 $ http_proxy=localhost:$HGPORT1 hg clone --config http_proxy.always=True http://localhost:$HGPORT/ c
54 requesting all changes
54 requesting all changes
55 adding changesets
55 adding changesets
56 adding manifests
56 adding manifests
57 adding file changes
57 adding file changes
58 added 1 changesets with 1 changes to 1 files
58 added 1 changesets with 1 changes to 1 files
59 updating to branch default
59 updating to branch default
60 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
60 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
61
61
62 proxy url with user name and password
62 proxy url with user name and password
63
63
64 $ http_proxy=http://user:passwd@localhost:$HGPORT1 hg clone --config http_proxy.always=True http://localhost:$HGPORT/ d
64 $ http_proxy=http://user:passwd@localhost:$HGPORT1 hg clone --config http_proxy.always=True http://localhost:$HGPORT/ d
65 requesting all changes
65 requesting all changes
66 adding changesets
66 adding changesets
67 adding manifests
67 adding manifests
68 adding file changes
68 adding file changes
69 added 1 changesets with 1 changes to 1 files
69 added 1 changesets with 1 changes to 1 files
70 updating to branch default
70 updating to branch default
71 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
71 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
72
72
73 url with user name and password
73 url with user name and password
74
74
75 $ http_proxy=http://user:passwd@localhost:$HGPORT1 hg clone --config http_proxy.always=True http://user:passwd@localhost:$HGPORT/ e
75 $ http_proxy=http://user:passwd@localhost:$HGPORT1 hg clone --config http_proxy.always=True http://user:passwd@localhost:$HGPORT/ e
76 requesting all changes
76 requesting all changes
77 adding changesets
77 adding changesets
78 adding manifests
78 adding manifests
79 adding file changes
79 adding file changes
80 added 1 changesets with 1 changes to 1 files
80 added 1 changesets with 1 changes to 1 files
81 updating to branch default
81 updating to branch default
82 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
82 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
83
83
84 bad host:port for proxy
84 bad host:port for proxy
85
85
86 $ http_proxy=localhost:$HGPORT2 hg clone --config http_proxy.always=True http://localhost:$HGPORT/ f
86 $ http_proxy=localhost:$HGPORT2 hg clone --config http_proxy.always=True http://localhost:$HGPORT/ f
87 abort: error: Connection refused
87 abort: error: Connection refused
88 [255]
88 [255]
89
89
90 do not use the proxy if it is in the no list
90 do not use the proxy if it is in the no list
91
91
92 $ http_proxy=localhost:$HGPORT1 hg clone --config http_proxy.no=localhost http://localhost:$HGPORT/ g
92 $ http_proxy=localhost:$HGPORT1 hg clone --config http_proxy.no=localhost http://localhost:$HGPORT/ g
93 requesting all changes
93 requesting all changes
94 adding changesets
94 adding changesets
95 adding manifests
95 adding manifests
96 adding file changes
96 adding file changes
97 added 1 changesets with 1 changes to 1 files
97 added 1 changesets with 1 changes to 1 files
98 updating to branch default
98 updating to branch default
99 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
99 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
100 $ cat proxy.log
100 $ cat proxy.log
101 * - - [*] "GET http://localhost:$HGPORT/?pairs=0000000000000000000000000000000000000000-0000000000000000000000000000000000000000&cmd=between HTTP/1.1" - - (glob)
101 * - - [*] "GET http://localhost:$HGPORT/?cmd=between&pairs=0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
102 * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
102 * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
103 * - - [*] "GET http://localhost:$HGPORT/?cmd=stream_out HTTP/1.1" - - (glob)
103 * - - [*] "GET http://localhost:$HGPORT/?cmd=stream_out HTTP/1.1" - - (glob)
104 * - - [*] "GET http://localhost:$HGPORT/?pairs=0000000000000000000000000000000000000000-0000000000000000000000000000000000000000&cmd=between HTTP/1.1" - - (glob)
104 * - - [*] "GET http://localhost:$HGPORT/?cmd=between&pairs=0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
105 * - - [*] "GET http://localhost:$HGPORT/?cmd=heads HTTP/1.1" - - (glob)
105 * - - [*] "GET http://localhost:$HGPORT/?cmd=heads HTTP/1.1" - - (glob)
106 * - - [*] "GET http://localhost:$HGPORT/?cmd=changegroup&roots=0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
106 * - - [*] "GET http://localhost:$HGPORT/?cmd=changegroup&roots=0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
107 * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
107 * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
108 * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys&namespace=bookmarks HTTP/1.1" - - (glob)
108 * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys&namespace=bookmarks HTTP/1.1" - - (glob)
109 * - - [*] "GET http://localhost:$HGPORT/?pairs=0000000000000000000000000000000000000000-0000000000000000000000000000000000000000&cmd=between HTTP/1.1" - - (glob)
109 * - - [*] "GET http://localhost:$HGPORT/?cmd=between&pairs=0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
110 * - - [*] "GET http://localhost:$HGPORT/?cmd=heads HTTP/1.1" - - (glob)
110 * - - [*] "GET http://localhost:$HGPORT/?cmd=heads HTTP/1.1" - - (glob)
111 * - - [*] "GET http://localhost:$HGPORT/?cmd=changegroup&roots=0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
111 * - - [*] "GET http://localhost:$HGPORT/?cmd=changegroup&roots=0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
112 * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
112 * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
113 * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys&namespace=bookmarks HTTP/1.1" - - (glob)
113 * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys&namespace=bookmarks HTTP/1.1" - - (glob)
114 * - - [*] "GET http://localhost:$HGPORT/?pairs=0000000000000000000000000000000000000000-0000000000000000000000000000000000000000&cmd=between HTTP/1.1" - - (glob)
114 * - - [*] "GET http://localhost:$HGPORT/?cmd=between&pairs=0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
115 * - - [*] "GET http://localhost:$HGPORT/?cmd=heads HTTP/1.1" - - (glob)
115 * - - [*] "GET http://localhost:$HGPORT/?cmd=heads HTTP/1.1" - - (glob)
116 * - - [*] "GET http://localhost:$HGPORT/?cmd=changegroup&roots=0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
116 * - - [*] "GET http://localhost:$HGPORT/?cmd=changegroup&roots=0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
117 * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
117 * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
118 * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys&namespace=bookmarks HTTP/1.1" - - (glob)
118 * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys&namespace=bookmarks HTTP/1.1" - - (glob)
119 * - - [*] "GET http://localhost:$HGPORT/?pairs=0000000000000000000000000000000000000000-0000000000000000000000000000000000000000&cmd=between HTTP/1.1" - - (glob)
119 * - - [*] "GET http://localhost:$HGPORT/?cmd=between&pairs=0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
120 * - - [*] "GET http://localhost:$HGPORT/?cmd=heads HTTP/1.1" - - (glob)
120 * - - [*] "GET http://localhost:$HGPORT/?cmd=heads HTTP/1.1" - - (glob)
121 * - - [*] "GET http://localhost:$HGPORT/?cmd=changegroup&roots=0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
121 * - - [*] "GET http://localhost:$HGPORT/?cmd=changegroup&roots=0000000000000000000000000000000000000000 HTTP/1.1" - - (glob)
122 * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
122 * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
123 * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys&namespace=bookmarks HTTP/1.1" - - (glob)
123 * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys&namespace=bookmarks HTTP/1.1" - - (glob)
124
124
General Comments 0
You need to be logged in to leave comments. Login now