Issue #695 improve getResponse methods
This commit is contained in:
parent
7afc36064b
commit
183e3acabb
|
@ -282,7 +282,7 @@ public class ByteArrayEndPoint extends AbstractEndPoint
|
|||
|
||||
try(Locker.Lock lock = _locker.lock())
|
||||
{
|
||||
if (BufferUtil.isEmpty(_out))
|
||||
if (BufferUtil.isEmpty(_out) && !_closed && !_oshut)
|
||||
_hasOutput.await(time,unit);
|
||||
|
||||
b=_out;
|
||||
|
|
|
@ -38,11 +38,20 @@ import org.eclipse.jetty.util.ByteArrayOutputStream2;
|
|||
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
||||
import org.eclipse.jetty.util.thread.Scheduler;
|
||||
|
||||
/**
|
||||
* A local connector, mostly for testing purposes.
|
||||
* <pre>
|
||||
* HttpTester.Request request = HttpTester.newRequest();
|
||||
* request.setURI("/some/resource");
|
||||
* HttpTester.Response response =
|
||||
* HttpTester.parseResponse(HttpTester.from(localConnector.getResponse(request.generate())));
|
||||
* </pre>
|
||||
*
|
||||
*/
|
||||
public class LocalConnector extends AbstractConnector
|
||||
{
|
||||
private final BlockingQueue<LocalEndPoint> _connects = new LinkedBlockingQueue<>();
|
||||
|
||||
|
||||
public LocalConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool pool, int acceptors, ConnectionFactory... factories)
|
||||
{
|
||||
super(server,executor,scheduler,pool,acceptors,factories);
|
||||
|
@ -198,20 +207,36 @@ public class LocalConnector extends AbstractConnector
|
|||
{
|
||||
return getResponse(requestsBuffer,false,10,TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
/** Get a single response using a parser to search for the end of the message.
|
||||
* @param requestBuffer The request to send
|
||||
* @param time The time to wait
|
||||
* @param unit The units of the wait
|
||||
* @return ByteBuffer containing response or null.
|
||||
* @throws Exception If there is a problem
|
||||
*/
|
||||
public ByteBuffer getResponse(ByteBuffer requestBuffer, long time,TimeUnit unit) throws Exception
|
||||
{
|
||||
boolean head = BufferUtil.toString(requestBuffer).toLowerCase().startsWith("head ");
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("requests {}", BufferUtil.toUTF8String(requestBuffer));
|
||||
LocalEndPoint endp = executeRequest(requestBuffer);
|
||||
return endp.waitForResponse(head,time,unit);
|
||||
}
|
||||
|
||||
/** Get a single response using a parser to search for the end of the message.
|
||||
* @param requestsBuffer The request to send
|
||||
* @param requestBuffer The request to send
|
||||
* @param head True if the response is for a head request
|
||||
* @param time The time to wait
|
||||
* @param unit The units of the wait
|
||||
* @return ByteBuffer containing response or null.
|
||||
* @throws Exception If there is a problem
|
||||
*/
|
||||
public ByteBuffer getResponse(ByteBuffer requestsBuffer,boolean head, long time,TimeUnit unit) throws Exception
|
||||
public ByteBuffer getResponse(ByteBuffer requestBuffer,boolean head, long time,TimeUnit unit) throws Exception
|
||||
{
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("requests {}", BufferUtil.toUTF8String(requestsBuffer));
|
||||
LocalEndPoint endp = executeRequest(requestsBuffer);
|
||||
LOG.debug("requests {}", BufferUtil.toUTF8String(requestBuffer));
|
||||
LocalEndPoint endp = executeRequest(requestBuffer);
|
||||
return endp.waitForResponse(head,time,unit);
|
||||
}
|
||||
|
||||
|
@ -225,6 +250,25 @@ public class LocalConnector extends AbstractConnector
|
|||
{
|
||||
return getResponse(rawRequest,false,30,TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
/** Get a single response using a parser to search for the end of the message.
|
||||
* @param rawRequest The request to send
|
||||
* @param time The time to wait
|
||||
* @param unit The units of the wait
|
||||
* @return ByteBuffer containing response or null.
|
||||
* @throws Exception If there is a problem
|
||||
*/
|
||||
public String getResponse(String rawRequest,long time,TimeUnit unit) throws Exception
|
||||
{
|
||||
boolean head = rawRequest.toLowerCase().startsWith("head ");
|
||||
ByteBuffer requestsBuffer = BufferUtil.toBuffer(rawRequest, StandardCharsets.ISO_8859_1);
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("request {}", BufferUtil.toUTF8String(requestsBuffer));
|
||||
LocalEndPoint endp = executeRequest(requestsBuffer);
|
||||
|
||||
return BufferUtil.toString(endp.waitForResponse(head,time,unit), StandardCharsets.ISO_8859_1);
|
||||
}
|
||||
|
||||
|
||||
/** Get a single response using a parser to search for the end of the message.
|
||||
* @param rawRequest The request to send
|
||||
|
@ -244,8 +288,6 @@ public class LocalConnector extends AbstractConnector
|
|||
return BufferUtil.toString(endp.waitForResponse(head,time,unit), StandardCharsets.ISO_8859_1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Local EndPoint
|
||||
*/
|
||||
public class LocalEndPoint extends ByteArrayEndPoint
|
||||
|
@ -332,7 +374,30 @@ public class LocalConnector extends AbstractConnector
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** Wait for a response using a parser to detect the end of message
|
||||
* @return Buffer containing full response or null for EOF;
|
||||
* @throws Exception
|
||||
*/
|
||||
public String getResponse() throws Exception
|
||||
{
|
||||
return getResponse(false,30,TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
/** Wait for a response using a parser to detect the end of message
|
||||
* @param head
|
||||
* @param time
|
||||
* @param unit
|
||||
* @return Buffer containing full response or null for EOF;
|
||||
* @throws Exception
|
||||
*/
|
||||
public String getResponse(boolean head, long time,TimeUnit unit) throws Exception
|
||||
{
|
||||
ByteBuffer response = waitForResponse(head,time,unit);
|
||||
if (response!=null)
|
||||
return BufferUtil.toString(response);
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Wait for a response using a parser to detect the end of message
|
||||
* @param head
|
||||
|
@ -391,7 +456,6 @@ public class LocalConnector extends AbstractConnector
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
HttpParser parser = new HttpParser(handler);
|
||||
parser.setHeadResponse(head);
|
||||
try(ByteArrayOutputStream2 bout = new ByteArrayOutputStream2();)
|
||||
|
@ -399,10 +463,20 @@ public class LocalConnector extends AbstractConnector
|
|||
loop: while(true)
|
||||
{
|
||||
// read a chunk of response
|
||||
ByteBuffer chunk = BufferUtil.hasContent(_responseData)
|
||||
? _responseData : waitForOutput(time,unit);
|
||||
_responseData=null;
|
||||
|
||||
ByteBuffer chunk;
|
||||
if (BufferUtil.hasContent(_responseData))
|
||||
chunk = _responseData;
|
||||
else
|
||||
{
|
||||
chunk = waitForOutput(time,unit);
|
||||
if (BufferUtil.isEmpty(chunk) && (!isOpen() || isOutputShutdown()))
|
||||
{
|
||||
parser.atEOF();
|
||||
parser.parseNext(BufferUtil.EMPTY_BUFFER);
|
||||
break loop;
|
||||
}
|
||||
}
|
||||
|
||||
// Parse the content of this chunk
|
||||
while (BufferUtil.hasContent(chunk))
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue