Fixes #5691 - HttpInput may skip setting fill interest.
HttpInput.run() now uses contentProvider.isReady() to ensure that if there is no content, the fill interest is set. AsyncContentProvider.isReady() is now looping if there is content but it cannot be transformed (e.g. too few gzipped bytes). Signed-off-by: Simone Bordet <simone.bordet@gmail.com>
This commit is contained in:
parent
8edb5cfc24
commit
4654335fdb
|
@ -222,18 +222,33 @@ class AsyncContentProducer implements ContentProducer
|
|||
if (content == null)
|
||||
{
|
||||
_httpChannel.getState().onReadUnready();
|
||||
if (_httpChannel.needContent())
|
||||
while (true)
|
||||
{
|
||||
content = nextTransformedContent();
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("isReady got transformed content after needContent retry {}", content);
|
||||
if (content != null)
|
||||
_httpChannel.getState().onContentAdded();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("isReady has no transformed content after needContent");
|
||||
if (_httpChannel.needContent())
|
||||
{
|
||||
content = nextTransformedContent();
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("isReady got transformed content after needContent retry {} {}", content, this);
|
||||
if (content != null)
|
||||
{
|
||||
_httpChannel.getState().onContentAdded();
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// We could have read some rawContent but not enough to generate
|
||||
// transformed content, so we need to call needContent() again
|
||||
// to tell the channel that more content is needed.
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("isReady could not transform content after needContent retry {}", this);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("isReady false needContent retry {}", this);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -291,6 +291,13 @@ public class HttpInput extends ServletInputStream implements Runnable
|
|||
@Override
|
||||
public void run()
|
||||
{
|
||||
// Call isReady() to make sure that if not ready we register for fill interest.
|
||||
if (!_contentProducer.isReady())
|
||||
{
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("running but not ready {}", this);
|
||||
return;
|
||||
}
|
||||
Content content = _contentProducer.nextContent();
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("running on content {} {}", content, this);
|
||||
|
|
Loading…
Reference in New Issue