use of org.apache.hc.core5.http.UnsupportedHttpVersionException in project httpcomponents-core by apache.
the class ClientHttp1StreamHandler method consumeHeader.
void consumeHeader(final HttpResponse response, final EntityDetails entityDetails) throws HttpException, IOException {
if (done.get() || responseState != MessageState.HEADERS) {
throw new ProtocolException("Unexpected message head");
}
final ProtocolVersion transportVersion = response.getVersion();
if (transportVersion != null && transportVersion.greaterEquals(HttpVersion.HTTP_2)) {
throw new UnsupportedHttpVersionException(transportVersion);
}
final int status = response.getCode();
if (status < HttpStatus.SC_INFORMATIONAL) {
throw new ProtocolException("Invalid response: " + new StatusLine(response));
}
if (status > HttpStatus.SC_CONTINUE && status < HttpStatus.SC_SUCCESS) {
exchangeHandler.consumeInformation(response, context);
} else {
if (!connectionReuseStrategy.keepAlive(committedRequest, response, context)) {
keepAlive = false;
}
}
if (requestState == MessageState.ACK) {
if (status == HttpStatus.SC_CONTINUE || status >= HttpStatus.SC_SUCCESS) {
outputChannel.setSocketTimeout(timeout);
requestState = MessageState.BODY;
if (status < HttpStatus.SC_CLIENT_ERROR) {
exchangeHandler.produce(internalDataChannel);
}
}
}
if (status < HttpStatus.SC_SUCCESS) {
return;
}
if (requestState == MessageState.BODY) {
if (status >= HttpStatus.SC_CLIENT_ERROR) {
requestState = MessageState.COMPLETE;
if (!outputChannel.abortGracefully()) {
keepAlive = false;
}
}
}
context.setProtocolVersion(transportVersion != null ? transportVersion : HttpVersion.HTTP_1_1);
context.setAttribute(HttpCoreContext.HTTP_RESPONSE, response);
httpProcessor.process(response, entityDetails, context);
if (entityDetails == null && !keepAlive) {
outputChannel.close();
}
exchangeHandler.consumeResponse(response, entityDetails, context);
if (entityDetails == null) {
responseState = MessageState.COMPLETE;
} else {
responseState = MessageState.BODY;
}
}
use of org.apache.hc.core5.http.UnsupportedHttpVersionException in project httpcomponents-core by apache.
the class TestHttpService method testUnsupportedHttpVersionException.
@Test
public void testUnsupportedHttpVersionException() throws Exception {
final HttpCoreContext context = HttpCoreContext.create();
final ClassicHttpRequest request = new BasicClassicHttpRequest("whatever", "/");
Mockito.when(conn.receiveRequestHeader()).thenReturn(request);
Mockito.when(responseFactory.newHttpResponse(200)).thenReturn(response);
Mockito.when(handlerResolver.resolve(request, context)).thenReturn(requestHandler);
Mockito.doThrow(new UnsupportedHttpVersionException()).when(requestHandler).handle(request, response, context);
httpservice.handleRequest(conn, context);
final ArgumentCaptor<ClassicHttpResponse> responseCaptor = ArgumentCaptor.forClass(ClassicHttpResponse.class);
Mockito.verify(conn).sendResponseHeader(responseCaptor.capture());
final ClassicHttpResponse error = responseCaptor.getValue();
Assertions.assertNotNull(error);
Assertions.assertSame(request, context.getRequest());
Assertions.assertEquals(HttpStatus.SC_HTTP_VERSION_NOT_SUPPORTED, error.getCode());
Mockito.verify(httprocessor).process(error, error.getEntity(), context);
Mockito.verify(conn).sendResponseHeader(error);
Mockito.verify(conn).sendResponseEntity(error);
Mockito.verify(conn).close();
}
use of org.apache.hc.core5.http.UnsupportedHttpVersionException in project httpcomponents-core by apache.
the class DefaultBHttpClientConnection method receiveResponseHeader.
@Override
public ClassicHttpResponse receiveResponseHeader() throws HttpException, IOException {
final SocketHolder socketHolder = ensureOpen();
final ClassicHttpResponse response = this.responseParser.parse(this.inBuffer, socketHolder.getInputStream());
if (response == null) {
throw new NoHttpResponseException("The target server failed to respond");
}
final ProtocolVersion transportVersion = response.getVersion();
if (transportVersion != null && transportVersion.greaterEquals(HttpVersion.HTTP_2)) {
throw new UnsupportedHttpVersionException(transportVersion);
}
this.version = transportVersion;
onResponseReceived(response);
final int status = response.getCode();
if (status < HttpStatus.SC_INFORMATIONAL) {
throw new ProtocolException("Invalid response: " + status);
}
if (response.getCode() >= HttpStatus.SC_SUCCESS) {
incrementResponseCount();
}
return response;
}
use of org.apache.hc.core5.http.UnsupportedHttpVersionException in project httpcomponents-core by apache.
the class DefaultBHttpServerConnection method receiveRequestHeader.
@Override
public ClassicHttpRequest receiveRequestHeader() throws HttpException, IOException {
final SocketHolder socketHolder = ensureOpen();
final ClassicHttpRequest request = this.requestParser.parse(this.inBuffer, socketHolder.getInputStream());
if (request == null) {
return null;
}
final ProtocolVersion transportVersion = request.getVersion();
if (transportVersion != null && transportVersion.greaterEquals(HttpVersion.HTTP_2)) {
throw new UnsupportedHttpVersionException(transportVersion);
}
request.setScheme(this.scheme);
this.version = transportVersion;
onRequestReceived(request);
incrementRequestCount();
return request;
}
use of org.apache.hc.core5.http.UnsupportedHttpVersionException in project httpcomponents-core by apache.
the class ServerHttp1StreamHandler method consumeHeader.
void consumeHeader(final HttpRequest request, final EntityDetails requestEntityDetails) throws HttpException, IOException {
if (done.get() || requestState != MessageState.HEADERS) {
throw new ProtocolException("Unexpected message head");
}
receivedRequest = request;
requestState = requestEntityDetails == null ? MessageState.COMPLETE : MessageState.BODY;
AsyncServerExchangeHandler handler;
try {
handler = exchangeHandlerFactory.create(request, context);
} catch (final MisdirectedRequestException ex) {
handler = new ImmediateResponseExchangeHandler(HttpStatus.SC_MISDIRECTED_REQUEST, ex.getMessage());
} catch (final HttpException ex) {
handler = new ImmediateResponseExchangeHandler(HttpStatus.SC_INTERNAL_SERVER_ERROR, ex.getMessage());
}
if (handler == null) {
handler = new ImmediateResponseExchangeHandler(HttpStatus.SC_NOT_FOUND, "Cannot handle request");
}
exchangeHandler = handler;
final ProtocolVersion transportVersion = request.getVersion();
if (transportVersion != null && transportVersion.greaterEquals(HttpVersion.HTTP_2)) {
throw new UnsupportedHttpVersionException(transportVersion);
}
context.setProtocolVersion(transportVersion != null ? transportVersion : HttpVersion.HTTP_1_1);
context.setAttribute(HttpCoreContext.HTTP_REQUEST, request);
try {
httpProcessor.process(request, requestEntityDetails, context);
exchangeHandler.handleRequest(request, requestEntityDetails, responseChannel, context);
} catch (final HttpException ex) {
if (!responseCommitted.get()) {
final HttpResponse response = new BasicHttpResponse(ServerSupport.toStatusCode(ex));
response.addHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
final AsyncResponseProducer responseProducer = new BasicResponseProducer(response, ServerSupport.toErrorMessage(ex));
exchangeHandler = new ImmediateResponseExchangeHandler(responseProducer);
exchangeHandler.handleRequest(request, requestEntityDetails, responseChannel, context);
} else {
throw ex;
}
}
}
Aggregations