use of com.nike.riposte.server.http.RequestInfo in project riposte by Nike-Inc.
the class BasicAuthSecurityValidatorTest method validateInvalidPassword.
@Test(expected = Unauthorized401Exception.class)
public void validateInvalidPassword() {
RequestInfo mockRequest = mock(RequestInfo.class);
doReturn(mock(HttpHeaders.class)).when(mockRequest).getHeaders();
when(mockRequest.getHeaders().get("Authorization")).thenReturn(calcAuthHeader(USERNAME, "blah"));
underTest.validateSecureRequestForEndpoint(mockRequest, mockEndpoint1);
}
use of com.nike.riposte.server.http.RequestInfo in project riposte by Nike-Inc.
the class SignalFxEndpointMetricsHandlerTest method MetricDimensionConfigurator_chainedWith_returns_ChainedMetricDimensionConfigurator_with_correct_args.
@Test
public void MetricDimensionConfigurator_chainedWith_returns_ChainedMetricDimensionConfigurator_with_correct_args() {
// given
MetricDimensionConfigurator orig = (rawBuilder, requestInfo, responseInfo, httpState, responseHttpStatusCode, responseHttpStatusCodeXXValue, elapsedTimeMillis, endpoint, endpointClass, method, matchingPathTemplate) -> null;
MetricDimensionConfigurator chainMe = mock(MetricDimensionConfigurator.class);
// when
MetricDimensionConfigurator result = orig.chainedWith(chainMe);
// then
assertThat(result).isInstanceOf(ChainedMetricDimensionConfigurator.class);
ChainedMetricDimensionConfigurator cmdc = (ChainedMetricDimensionConfigurator) result;
assertThat(cmdc.firstConfigurator).isSameAs(orig);
assertThat(cmdc.secondConfigurator).isSameAs(chainMe);
}
use of com.nike.riposte.server.http.RequestInfo in project riposte by Nike-Inc.
the class RequestInfoSetterHandlerTest method doChannelRead_creates_and_sets_RequestInfo_on_state_and_RequestInfo_is_marked_as_complete_with_all_chunks_if_msg_is_FullHttpRequest.
@Test
public void doChannelRead_creates_and_sets_RequestInfo_on_state_and_RequestInfo_is_marked_as_complete_with_all_chunks_if_msg_is_FullHttpRequest() {
// given
FullHttpRequest msgMock = mock(FullHttpRequest.class);
String uri = "/some/url";
HttpHeaders headers = new DefaultHttpHeaders();
doReturn(uri).when(msgMock).getUri();
doReturn(headers).when(msgMock).headers();
doReturn(headers).when(msgMock).trailingHeaders();
doReturn(byteBufMock).when(msgMock).content();
doReturn(false).when(byteBufMock).isReadable();
doReturn(HttpVersion.HTTP_1_1).when(msgMock).getProtocolVersion();
// when
PipelineContinuationBehavior result = handler.doChannelRead(ctxMock, msgMock);
// then
ArgumentCaptor<RequestInfo> requestInfoArgumentCaptor = ArgumentCaptor.forClass(RequestInfo.class);
verify(stateMock).setRequestInfo(requestInfoArgumentCaptor.capture());
RequestInfo requestInfo = requestInfoArgumentCaptor.getValue();
assertThat(requestInfo.getUri()).isEqualTo(uri);
assertThat(requestInfo.isCompleteRequestWithAllChunks()).isTrue();
assertThat(result).isEqualTo(PipelineContinuationBehavior.CONTINUE);
}
use of com.nike.riposte.server.http.RequestInfo in project riposte by Nike-Inc.
the class AccessLogEndHandler method doAccessLogging.
protected void doAccessLogging(ChannelHandlerContext ctx) throws Exception {
if (accessLogger == null)
return;
HttpProcessingState httpProcessingState = ChannelAttributes.getHttpProcessingStateForChannel(ctx).get();
if (httpProcessingState == null) {
runnableWithTracingAndMdc(() -> logger.warn("HttpProcessingState is null. This shouldn't happen."), ctx).run();
}
// logging for this request, so make sure we only do it if appropriate
if (httpProcessingState != null && !httpProcessingState.isAccessLogCompletedOrScheduled()) {
Instant startTime = httpProcessingState.getRequestStartTime();
ResponseInfo responseInfo = httpProcessingState.getResponseInfo();
HttpResponse actualResponseObject = httpProcessingState.getActualResponseObject();
RequestInfo requestInfo = httpProcessingState.getRequestInfo();
ChannelFutureListener doTheAccessLoggingOperation = new ChannelFutureListenerWithTracingAndMdc((channelFuture) -> accessLogger.log(requestInfo, actualResponseObject, responseInfo, Instant.now().minusMillis(startTime.toEpochMilli()).toEpochMilli()), ctx);
// conditions), otherwise do it when the response finishes.
if (!httpProcessingState.isResponseSendingLastChunkSent())
doTheAccessLoggingOperation.operationComplete(null);
else
httpProcessingState.getResponseWriterFinalChunkChannelFuture().addListener(doTheAccessLoggingOperation);
httpProcessingState.setAccessLogCompletedOrScheduled(true);
}
}
use of com.nike.riposte.server.http.RequestInfo in project riposte by Nike-Inc.
the class ChannelPipelineFinalizerHandler method finalizeChannelPipeline.
/**
* This will first check the given state to see if a response was sent to the user. If not then this method will
* send a generic error to the user so they get some response (so this method is kind of a backstop in case requests
* somehow slip through our pipeline without being handled, which should never happen, but we have to have this just
* in case). Then it will clean out the state so that it is ready for the next request.
* <p/>
* If the state indicates that a response was already sent then this method will only clean out the state for the
* next request and will not send an error.
*/
protected void finalizeChannelPipeline(ChannelHandlerContext ctx, Object msg, HttpProcessingState state, Throwable cause) throws JsonProcessingException {
RequestInfo<?> requestInfo = exceptionHandlingHandler.getRequestInfo(state, msg);
// is sent it will update the state.isResponseSent() so that further calls will return true.
if (!state.isResponseSendingStarted()) {
String errorMsg = "Discovered a request that snuck through without a response being sent. This should not " + "be possible and indicates a major problem in the channel pipeline.";
logger.error(errorMsg, new Exception("Wrapper exception", cause));
// Send a generic unhandled error response with a wrapper exception so that the logging info output by the
// exceptionHandlingHandler will have the overview of what went wrong.
Exception exceptionToUse = new Exception(errorMsg, cause);
ResponseInfo<ErrorResponseBody> responseInfo = exceptionHandlingHandler.processUnhandledError(state, msg, exceptionToUse);
responseSender.sendErrorResponse(ctx, requestInfo, responseInfo);
}
ctx.flush();
// the metrics for this request, so make sure we only do it if appropriate.
if (metricsListener != null && !state.isRequestMetricsRecordedOrScheduled()) {
// conditions), otherwise do it when the response finishes.
if (!state.isResponseSendingLastChunkSent()) {
// TODO: Somehow mark the state as a failed request and update the metrics listener to handle it
metricsListener.onEvent(ServerMetricsEvent.RESPONSE_SENT, state);
} else {
// We need to use a copy of the state in case the original state gets cleaned.
HttpProcessingState stateCopy = new HttpProcessingState(state);
stateCopy.getResponseWriterFinalChunkChannelFuture().addListener((ChannelFutureListener) channelFuture -> {
if (channelFuture.isSuccess())
metricsListener.onEvent(ServerMetricsEvent.RESPONSE_SENT, stateCopy);
else {
metricsListener.onEvent(ServerMetricsEvent.RESPONSE_WRITE_FAILED, null);
}
});
}
state.setRequestMetricsRecordedOrScheduled(true);
}
// Make sure to clear out request info chunks, multipart data, and any other resources to prevent reference
// counting memory leaks (or any other kind of memory leaks).
requestInfo.releaseAllResources();
// channel if it sits unused longer than the timeout value before the next request arrives.
if (workerChannelIdleTimeoutMillis > 0 && ctx.pipeline().get(IDLE_CHANNEL_TIMEOUT_HANDLER_NAME) == null) {
ctx.pipeline().addFirst(IDLE_CHANNEL_TIMEOUT_HANDLER_NAME, new IdleChannelTimeoutHandler(workerChannelIdleTimeoutMillis, "ServerWorkerChannel"));
}
// request is broken. We can't do anything except kill the channel.
if ((cause != null) && state.isResponseSendingStarted() && !state.isResponseSendingLastChunkSent()) {
runnableWithTracingAndMdc(() -> logger.error("Received an error in ChannelPipelineFinalizerHandler after response sending was started, but " + "before it finished. Closing the channel. unexpected_error={}", cause.toString()), ctx).run();
ctx.channel().close();
}
}
Aggregations