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) |