Mercurial > public > mercurial-scm > hg
comparison mercurial/httppeer.py @ 33805:f913e90f15a0
httppeer: use peer interface
This is similar to what we did to sshpeer. Quirks and all.
Differential Revision: https://phab.mercurial-scm.org/D337
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sun, 06 Aug 2017 18:00:19 -0700 |
parents | 73fd395ee29e |
children | dedab036215d |
comparison
equal
deleted
inserted
replaced
33804:1f8460b55986 | 33805:f913e90f15a0 |
---|---|
19 from . import ( | 19 from . import ( |
20 bundle2, | 20 bundle2, |
21 error, | 21 error, |
22 httpconnection, | 22 httpconnection, |
23 pycompat, | 23 pycompat, |
24 repository, | |
24 statichttprepo, | 25 statichttprepo, |
25 url, | 26 url, |
26 util, | 27 util, |
27 wireproto, | 28 wireproto, |
28 ) | 29 ) |
84 'if the error persists, consider contacting the ' | 85 'if the error persists, consider contacting the ' |
85 'network or server operator')) | 86 'network or server operator')) |
86 | 87 |
87 resp.__class__ = readerproxy | 88 resp.__class__ = readerproxy |
88 | 89 |
89 class httppeer(wireproto.wirepeer): | 90 class httppeer(wireproto.wirepeer, repository.legacypeer): |
90 def __init__(self, ui, path): | 91 def __init__(self, ui, path): |
91 self._path = path | 92 self._path = path |
92 self._caps = None | 93 self._caps = None |
93 self._urlopener = None | 94 self._urlopener = None |
94 self._requestbuilder = None | 95 self._requestbuilder = None |
98 (u.query or u.fragment)) | 99 (u.query or u.fragment)) |
99 | 100 |
100 # urllib cannot handle URLs with embedded user or passwd | 101 # urllib cannot handle URLs with embedded user or passwd |
101 self._url, authinfo = u.authinfo() | 102 self._url, authinfo = u.authinfo() |
102 | 103 |
103 self.ui = ui | 104 self._ui = ui |
104 self.ui.debug('using %s\n' % self._url) | 105 ui.debug('using %s\n' % self._url) |
105 | 106 |
106 self._urlopener = url.opener(ui, authinfo) | 107 self._urlopener = url.opener(ui, authinfo) |
107 self._requestbuilder = urlreq.request | 108 self._requestbuilder = urlreq.request |
109 | |
110 # TODO remove once peerrepository isn't in inheritance. | |
111 self._capabilities = self.capabilities | |
108 | 112 |
109 def __del__(self): | 113 def __del__(self): |
110 urlopener = getattr(self, '_urlopener', None) | 114 urlopener = getattr(self, '_urlopener', None) |
111 if urlopener: | 115 if urlopener: |
112 for h in urlopener.handlers: | 116 for h in urlopener.handlers: |
113 h.close() | 117 h.close() |
114 getattr(h, "close_all", lambda : None)() | 118 getattr(h, "close_all", lambda : None)() |
115 | 119 |
120 # Begin of _basepeer interface. | |
121 | |
122 @util.propertycache | |
123 def ui(self): | |
124 return self._ui | |
125 | |
116 def url(self): | 126 def url(self): |
117 return self._path | 127 return self._path |
118 | 128 |
119 # look up capabilities only when needed | 129 def local(self): |
120 | 130 return None |
121 def _fetchcaps(self): | 131 |
122 self._caps = set(self._call('capabilities').split()) | 132 def peer(self): |
123 | 133 return self |
124 def _capabilities(self): | 134 |
135 def canpush(self): | |
136 return True | |
137 | |
138 def close(self): | |
139 pass | |
140 | |
141 # End of _basepeer interface. | |
142 | |
143 # Begin of _basewirepeer interface. | |
144 | |
145 def capabilities(self): | |
125 if self._caps is None: | 146 if self._caps is None: |
126 try: | 147 try: |
127 self._fetchcaps() | 148 self._fetchcaps() |
128 except error.RepoError: | 149 except error.RepoError: |
129 self._caps = set() | 150 self._caps = set() |
130 self.ui.debug('capabilities: %s\n' % | 151 self.ui.debug('capabilities: %s\n' % |
131 (' '.join(self._caps or ['none']))) | 152 (' '.join(self._caps or ['none']))) |
132 return self._caps | 153 return self._caps |
154 | |
155 # End of _basewirepeer interface. | |
156 | |
157 # look up capabilities only when needed | |
158 | |
159 def _fetchcaps(self): | |
160 self._caps = set(self._call('capabilities').split()) | |
133 | 161 |
134 def _callstream(self, cmd, _compressible=False, **args): | 162 def _callstream(self, cmd, _compressible=False, **args): |
135 if cmd == 'pushkey': | 163 if cmd == 'pushkey': |
136 args['data'] = '' | 164 args['data'] = '' |
137 data = args.pop('data', None) | 165 data = args.pop('data', None) |