removed lock from HttpParser. Altered way that returnBuffers called to avoid nulling buffer for other thread
This commit is contained in:
parent
ca8873593a
commit
26bf17f9c1
|
@ -83,8 +83,6 @@ public class HttpParser implements Parser
|
|||
protected int _chunkPosition;
|
||||
private boolean _headResponse;
|
||||
|
||||
private Lock _lock = new ReentrantLock(); // Ensure only a single parsing/resetting thread
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
/**
|
||||
* Constructor.
|
||||
|
@ -252,7 +250,6 @@ public class HttpParser implements Parser
|
|||
*/
|
||||
public int parseNext() throws IOException
|
||||
{
|
||||
_lock.lock();
|
||||
try
|
||||
{
|
||||
int progress=0;
|
||||
|
@ -278,6 +275,7 @@ public class HttpParser implements Parser
|
|||
{
|
||||
_state=STATE_END;
|
||||
_handler.messageComplete(_contentPosition);
|
||||
returnBuffers();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -340,6 +338,7 @@ public class HttpParser implements Parser
|
|||
if (!isComplete() && !isIdle())
|
||||
throw new EofException();
|
||||
|
||||
returnBuffers();
|
||||
return -1;
|
||||
}
|
||||
length=_buffer.length();
|
||||
|
@ -453,6 +452,7 @@ public class HttpParser implements Parser
|
|||
_state=STATE_SEEKING_EOF;
|
||||
_handler.headerComplete();
|
||||
_handler.messageComplete(_contentPosition);
|
||||
returnBuffers();
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
@ -482,6 +482,7 @@ public class HttpParser implements Parser
|
|||
_state=STATE_SEEKING_EOF;
|
||||
_handler.headerComplete();
|
||||
_handler.messageComplete(_contentPosition);
|
||||
returnBuffers();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -645,7 +646,8 @@ public class HttpParser implements Parser
|
|||
_handler.headerComplete();
|
||||
_state=_persistent||(_responseStatus>=100&&_responseStatus<200)?STATE_END:STATE_SEEKING_EOF;
|
||||
_handler.messageComplete(_contentPosition);
|
||||
break;
|
||||
returnBuffers();
|
||||
return 1;
|
||||
|
||||
default:
|
||||
_state=STATE_CONTENT;
|
||||
|
@ -850,6 +852,7 @@ public class HttpParser implements Parser
|
|||
{
|
||||
_state=_persistent?STATE_END:STATE_SEEKING_EOF;
|
||||
_handler.messageComplete(_contentPosition);
|
||||
returnBuffers();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -869,6 +872,7 @@ public class HttpParser implements Parser
|
|||
{
|
||||
_state=_persistent?STATE_END:STATE_SEEKING_EOF;
|
||||
_handler.messageComplete(_contentPosition);
|
||||
returnBuffers();
|
||||
}
|
||||
// TODO adjust the _buffer to keep unconsumed content
|
||||
return 1;
|
||||
|
@ -903,6 +907,7 @@ public class HttpParser implements Parser
|
|||
_eol=_buffer.get();
|
||||
_state=_persistent?STATE_END:STATE_SEEKING_EOF;
|
||||
_handler.messageComplete(_contentPosition);
|
||||
returnBuffers();
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
|
@ -933,6 +938,7 @@ public class HttpParser implements Parser
|
|||
_eol=_buffer.get();
|
||||
_state=_persistent?STATE_END:STATE_SEEKING_EOF;
|
||||
_handler.messageComplete(_contentPosition);
|
||||
returnBuffers();
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
|
@ -979,10 +985,6 @@ public class HttpParser implements Parser
|
|||
_state=STATE_SEEKING_EOF;
|
||||
throw e;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
|
@ -1047,9 +1049,6 @@ public class HttpParser implements Parser
|
|||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
public void reset()
|
||||
{
|
||||
_lock.lock();
|
||||
try
|
||||
{
|
||||
// reset state
|
||||
_contentView.setGetIndex(_contentView.putIndex());
|
||||
|
@ -1093,19 +1092,12 @@ public class HttpParser implements Parser
|
|||
_body.setMarkIndex(-1);
|
||||
|
||||
_buffer=_header;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_lock.unlock();
|
||||
}
|
||||
returnBuffers();
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
public void returnBuffers()
|
||||
{
|
||||
_lock.lock();
|
||||
try
|
||||
{
|
||||
if (_body!=null && !_body.hasContent() && _body.markIndex()==-1 && _buffers!=null)
|
||||
{
|
||||
|
@ -1124,11 +1116,6 @@ public class HttpParser implements Parser
|
|||
_header=null;
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------- */
|
||||
public void setState(int state)
|
||||
|
|
|
@ -125,8 +125,11 @@ public class AsyncHttpConnection extends AbstractHttpConnection implements Async
|
|||
finally
|
||||
{
|
||||
setCurrentConnection(null);
|
||||
if (!_request.isAsyncStarted())
|
||||
{
|
||||
_parser.returnBuffers();
|
||||
_generator.returnBuffers();
|
||||
}
|
||||
|
||||
// Safety net to catch spinning
|
||||
if (some_progress)
|
||||
|
|
|
@ -66,6 +66,7 @@ public class AsyncRequestReadTest
|
|||
@Test
|
||||
public void test() throws Exception
|
||||
{
|
||||
total=0;
|
||||
final Socket socket = new Socket("localhost",connector.getLocalPort());
|
||||
|
||||
byte[] content = new byte[16*4096];
|
||||
|
|
Loading…
Reference in New Issue