Show More
@@ -377,25 +377,30 b' class clienthandler(object):' | |||
|
377 | 377 | # This can raise. The caller can handle it. |
|
378 | 378 | response._onresponsedata(meta['data']) |
|
379 | 379 | |
|
380 | # If we got a content redirect response, we want to fetch it and | |
|
381 | # expose the data as if we received it inline. But we also want to | |
|
382 | # keep our internal request accounting in order. Our strategy is to | |
|
383 | # basically put meaningful response handling on pause until EOS occurs | |
|
384 | # and the stream accounting is in a good state. At that point, we follow | |
|
385 | # the redirect and replace the response object with its data. | |
|
380 | # We need to be careful about resolving futures prematurely. If a | |
|
381 | # response is a redirect response, resolving the future before the | |
|
382 | # redirect is processed would result in the consumer seeing an | |
|
383 | # empty stream of objects, since they'd be consuming our | |
|
384 | # response.objects() instead of the redirect's response.objects(). | |
|
385 | # | |
|
386 | # Our strategy is to not resolve/finish the request until either | |
|
387 | # EOS occurs or until the initial response object is fully received. | |
|
386 | 388 | |
|
387 | redirect = response._redirect | |
|
388 | handlefuture = False if redirect else True | |
|
389 | ||
|
389 | # Always react to eos. | |
|
390 | 390 | if meta['eos']: |
|
391 | 391 | response._oninputcomplete() |
|
392 | 392 | del self._requests[frame.requestid] |
|
393 | 393 | |
|
394 | if redirect: | |
|
395 | self._followredirect(frame.requestid, redirect) | |
|
396 | return | |
|
394 | # Not EOS but we haven't decoded the initial response object yet. | |
|
395 | # Return and wait for more data. | |
|
396 | elif not response._seeninitial: | |
|
397 | return | |
|
397 | 398 | |
|
398 | if not handlefuture: | |
|
399 | # The specification says no objects should follow the initial/redirect | |
|
400 | # object. So it should be safe to handle the redirect object if one is | |
|
401 | # decoded, without having to wait for EOS. | |
|
402 | if response._redirect: | |
|
403 | self._followredirect(frame.requestid, response._redirect) | |
|
399 | 404 | return |
|
400 | 405 | |
|
401 | 406 | # If the command has a decoder, we wait until all input has been |
General Comments 0
You need to be logged in to leave comments.
Login now