comparison mercurial/wireprotov2peer.py @ 39438:c734a5c82f38

wireprotov2peer: split responsedata handling into separate function So we don't have so much logic inside an if/elif block. Differential Revision: https://phab.mercurial-scm.org/D4439
author Gregory Szorc <gregory.szorc@gmail.com>
date Thu, 23 Aug 2018 13:46:39 -0700
parents 1467b6c27ff9
children 9f51fd22ed50
comparison
equal deleted inserted replaced
39437:3c6f7eebc010 39438:c734a5c82f38
134 'never told about this request: %r' % frame) 134 'never told about this request: %r' % frame)
135 135
136 response = self._responses[frame.requestid] 136 response = self._responses[frame.requestid]
137 137
138 if action == 'responsedata': 138 if action == 'responsedata':
139 # This buffers all data until end of stream is received. This 139 self._processresponsedata(frame, meta, response)
140 # is bad for performance.
141 # TODO make response data streamable
142 response.b.write(meta['data'])
143
144 if meta['eos']:
145 # If the command has a decoder, resolve the future to the
146 # decoded value. Otherwise resolve to the rich response object.
147 decoder = COMMAND_DECODERS.get(response.command)
148
149 # TODO consider always resolving the overall status map.
150 if decoder:
151 objs = response.cborobjects()
152
153 overall = next(objs)
154
155 if overall['status'] == 'ok':
156 self._futures[frame.requestid].set_result(decoder(objs))
157 else:
158 e = error.RepoError(
159 formatrichmessage(overall['error']['message']))
160 self._futures[frame.requestid].set_exception(e)
161 else:
162 self._futures[frame.requestid].set_result(response)
163
164 del self._requests[frame.requestid]
165 del self._futures[frame.requestid]
166
167 else: 140 else:
168 raise error.ProgrammingError( 141 raise error.ProgrammingError(
169 'unhandled action from clientreactor: %s' % action) 142 'unhandled action from clientreactor: %s' % action)
143
144 def _processresponsedata(self, frame, meta, response):
145 # This buffers all data until end of stream is received. This
146 # is bad for performance.
147 # TODO make response data streamable
148 response.b.write(meta['data'])
149
150 if meta['eos']:
151 # If the command has a decoder, resolve the future to the
152 # decoded value. Otherwise resolve to the rich response object.
153 decoder = COMMAND_DECODERS.get(response.command)
154
155 # TODO consider always resolving the overall status map.
156 if decoder:
157 objs = response.cborobjects()
158
159 overall = next(objs)
160
161 if overall['status'] == 'ok':
162 self._futures[frame.requestid].set_result(decoder(objs))
163 else:
164 e = error.RepoError(
165 formatrichmessage(overall['error']['message']))
166 self._futures[frame.requestid].set_exception(e)
167 else:
168 self._futures[frame.requestid].set_result(response)
169
170 del self._requests[frame.requestid]
171 del self._futures[frame.requestid]
170 172
171 def decodebranchmap(objs): 173 def decodebranchmap(objs):
172 # Response should be a single CBOR map of branch name to array of nodes. 174 # Response should be a single CBOR map of branch name to array of nodes.
173 bm = next(objs) 175 bm = next(objs)
174 176