public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { ResponseJSONP responseJsonp = returnType.getMethodAnnotation(ResponseJSONP.class); if(responseJsonp == null){ responseJsonp = returnType.getContainingClass().getAnnotation(ResponseJSONP.class); } HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest(); String callbackMethodName = servletRequest.getParameter(responseJsonp.callback()); if (!IOUtils.isValidJsonpQueryParam(callbackMethodName)) { if (logger.isDebugEnabled()) { logger.debug("Invalid jsonp parameter value:" + callbackMethodName); } callbackMethodName = null; } JSONPObject jsonpObject = new JSONPObject(callbackMethodName); jsonpObject.addParameter(body); beforeBodyWriteInternal(jsonpObject, selectedContentType, returnType, request, response); return jsonpObject; }
/** * Invoked only if the converter type is {@code FastJsonpHttpMessageConverter4}. */ public void beforeBodyWriteInternal(MappingFastJsonValue bodyContainer, MediaType contentType, MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) { HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest(); for (String name : this.jsonpQueryParamNames) { String value = servletRequest.getParameter(name); if (value != null) { if (!isValidJsonpQueryParam(value)) { continue; } // MediaType contentTypeToUse = getContentType(contentType, request, response); // response.getHeaders().setContentType(contentTypeToUse); bodyContainer.setJsonpFunction(value); break; } } }
@Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { System.out.println("before handshake"); ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; HttpSession session = servletRequest.getServletRequest().getSession(false); Long uid = (Long)session.getAttribute("uid"); if(uid == null){ return false; } //如果uid==null,afterConnectionEstablished不执行,协议转换不成功,报下面的错误 //websocket.html?uid=1990:56 WebSocket connection to 'ws://localhost:8080/ws?uid=1990' failed: Error during WebSocket handshake: Unexpected response code: 500 attributes.put("uid", uid); return true; // 如果这里返回false,浏览器会报下面这个错误 // WebSocket connection to 'ws://localhost:8080/ws' failed: Error during WebSocket handshake: Unexpected response code: 200 }
@Override protected void doFilterInternal(final HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if (("PUT".equals(request.getMethod()) || "PATCH".equals(request.getMethod())) && isFormContentType(request)) { HttpInputMessage inputMessage = new ServletServerHttpRequest(request) { @Override public InputStream getBody() throws IOException { return request.getInputStream(); } }; MultiValueMap<String, String> formParameters = formConverter.read(null, inputMessage); HttpServletRequest wrapper = new HttpPutFormContentRequestWrapper(request, formParameters); filterChain.doFilter(wrapper, response); } else { filterChain.doFilter(request, response); } }
/** * Build log message for request in bound. * * @param request Request in bound. * @return Log message. * @since 1.0.0 */ protected String buildRequestLog(HttpServletRequest request) { ServerHttpRequest httpRequest = new ServletServerHttpRequest(request); StringBuilder sb = new StringBuilder("Server has received a request").append(StringUtils.LF) .append(" > ").append(httpRequest.getMethod()).append(" ").append(httpRequest.getURI()).append (StringUtils.LF); Map<String, String> headers = httpRequest.getHeaders().toSingleValueMap(); for (Map.Entry<String, String> entry : headers.entrySet()) { sb.append(" > ").append(entry.getKey()).append(": ").append(entry.getValue()).append(StringUtils.LF); } sb.append(extractRequestPayload(request)); return sb.toString(); }
@Override protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaType contentType, MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) { HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest(); for (String name : this.jsonpQueryParamNames) { String value = servletRequest.getParameter(name); if (value != null) { if (!isValidJsonpQueryParam(value)) { if (logger.isDebugEnabled()) { logger.debug("Ignoring invalid jsonp parameter value: " + value); } continue; } MediaType contentTypeToUse = getContentType(contentType, request, response); response.getHeaders().setContentType(contentTypeToUse); bodyContainer.setJsonpFunction(value); break; } } }
@Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws IOException, HttpMediaTypeNotSupportedException { ServletServerHttpRequest inputMessage = createInputMessage(webRequest); Type paramType = getHttpEntityType(parameter); Object body = readWithMessageConverters(webRequest, parameter, paramType); if (RequestEntity.class == parameter.getParameterType()) { return new RequestEntity<Object>(body, inputMessage.getHeaders(), inputMessage.getMethod(), inputMessage.getURI()); } else { return new HttpEntity<Object>(body, inputMessage.getHeaders()); } }
private boolean isResourceNotModified(ServletServerHttpRequest inputMessage, ServletServerHttpResponse outputMessage) { List<String> ifNoneMatch = inputMessage.getHeaders().getIfNoneMatch(); long ifModifiedSince = inputMessage.getHeaders().getIfModifiedSince(); String eTag = addEtagPadding(outputMessage.getHeaders().getETag()); long lastModified = outputMessage.getHeaders().getLastModified(); boolean notModified = false; if (!ifNoneMatch.isEmpty() && (inputMessage.getHeaders().containsKey(HttpHeaders.IF_UNMODIFIED_SINCE) || inputMessage.getHeaders().containsKey(HttpHeaders.IF_MATCH))) { // invalid conditional request, do not process } else if (lastModified != -1 && StringUtils.hasLength(eTag)) { notModified = isETagNotModified(ifNoneMatch, eTag) && isTimeStampNotModified(ifModifiedSince, lastModified); } else if (lastModified != -1) { notModified = isTimeStampNotModified(ifModifiedSince, lastModified); } else if (StringUtils.hasLength(eTag)) { notModified = isETagNotModified(ifNoneMatch, eTag); } return notModified; }
@Override protected <T> Object readWithMessageConverters(NativeWebRequest webRequest, MethodParameter methodParam, Type paramType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException { HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class); ServletServerHttpRequest inputMessage = new ServletServerHttpRequest(servletRequest); Object arg = readWithMessageConverters(inputMessage, methodParam, paramType); if (arg == null) { if (methodParam.getParameterAnnotation(RequestBody.class).required()) { throw new HttpMessageNotReadableException("Required request body is missing: " + methodParam.getMethod().toGenericString()); } } return arg; }
/** * Initialize a builder with a scheme, host,and port (but not path and query). */ private static ServletUriComponentsBuilder initFromRequest(HttpServletRequest request) { HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents uriComponents = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); String scheme = uriComponents.getScheme(); String host = uriComponents.getHost(); int port = uriComponents.getPort(); ServletUriComponentsBuilder builder = new ServletUriComponentsBuilder(); builder.scheme(scheme); builder.host(host); if (("http".equals(scheme) && port != 80) || ("https".equals(scheme) && port != 443)) { builder.port(port); } return builder; }
@SuppressWarnings("unchecked") @Test public void requestBodyAdvice() throws IOException { RequestBodyAdvice requestAdvice = Mockito.mock(RequestBodyAdvice.class); ResponseBodyAdvice<String> responseAdvice = Mockito.mock(ResponseBodyAdvice.class); List<Object> advice = Arrays.asList(requestAdvice, responseAdvice); RequestResponseBodyAdviceChain chain = new RequestResponseBodyAdviceChain(advice); HttpInputMessage wrapped = new ServletServerHttpRequest(new MockHttpServletRequest()); given(requestAdvice.supports(this.paramType, String.class, this.converterType)).willReturn(true); given(requestAdvice.beforeBodyRead(eq(this.request), eq(this.paramType), eq(String.class), eq(this.converterType))).willReturn(wrapped); assertSame(wrapped, chain.beforeBodyRead(this.request, this.paramType, String.class, this.converterType)); String modified = "body++"; given(requestAdvice.afterBodyRead(eq(this.body), eq(this.request), eq(this.paramType), eq(String.class), eq(this.converterType))).willReturn(modified); assertEquals(modified, chain.afterBodyRead(this.body, this.request, this.paramType, String.class, this.converterType)); }
@Test public void fromRequestWithForwardedHostAndPort() { MockHttpServletRequest request = new MockHttpServletRequest(); request.setScheme("http"); request.setServerName("localhost"); request.setServerPort(80); request.setRequestURI("/mvc-showcase"); request.addHeader("X-Forwarded-Proto", "https"); request.addHeader("X-Forwarded-Host", "84.198.58.199"); request.addHeader("X-Forwarded-Port", "443"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https://84.198.58.199/mvc-showcase", result.toString()); }
@Test public void fromHttpRequest() throws URISyntaxException { MockHttpServletRequest request = new MockHttpServletRequest(); request.setScheme("http"); request.setServerName("localhost"); request.setServerPort(-1); request.setRequestURI("/path"); request.setQueryString("a=1"); UriComponents result = UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build(); assertEquals("http", result.getScheme()); assertEquals("localhost", result.getHost()); assertEquals(-1, result.getPort()); assertEquals("/path", result.getPath()); assertEquals("a=1", result.getQuery()); }
@Test public void fromHttpRequestResetsPortBeforeSettingIt() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("X-Forwarded-Proto", "https"); request.addHeader("X-Forwarded-Host", "84.198.58.199"); request.addHeader("X-Forwarded-Port", 443); request.setScheme("http"); request.setServerName("example.com"); request.setServerPort(80); request.setRequestURI("/rest/mobile/users/1"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https", result.getScheme()); assertEquals("84.198.58.199", result.getHost()); assertEquals(-1, result.getPort()); assertEquals("/rest/mobile/users/1", result.getPath()); }
@Test public void fromHttpRequestWithForwardedHostWithForwardedScheme() { MockHttpServletRequest request = new MockHttpServletRequest(); request.setScheme("http"); request.setServerName("localhost"); request.setServerPort(10080); request.addHeader("X-Forwarded-Host", "example.org"); request.addHeader("X-Forwarded-Proto", "https"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("example.org", result.getHost()); assertEquals("https", result.getScheme()); assertEquals(-1, result.getPort()); }
@Test public void fromHttpRequestWithForwardedProtoAndDefaultPort() { MockHttpServletRequest request = new MockHttpServletRequest(); request.setScheme("http"); request.setServerName("localhost"); request.setServerPort(80); request.setRequestURI("/mvc-showcase"); request.addHeader("X-Forwarded-Proto", "https"); request.addHeader("X-Forwarded-Host", "84.198.58.199"); request.addHeader("X-Forwarded-Port", "443"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https://84.198.58.199/mvc-showcase", result.toString()); }
@Test public void fromHttpRequestWithForwardedProtoMultiValueHeader() { MockHttpServletRequest request = new MockHttpServletRequest(); request.setScheme("http"); request.setServerName("localhost"); request.setServerPort(8080); request.setRequestURI("/mvc-showcase"); request.addHeader("X-Forwarded-Host", "a.example.org"); request.addHeader("X-Forwarded-Port", "443"); request.addHeader("X-Forwarded-Proto", "https,https"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https://a.example.org/mvc-showcase", result.toString()); }
@Test public void fromHttpRequestMultipleForwardedHeader() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("Forwarded", "host=84.198.58.199;proto=https"); request.addHeader("Forwarded", "proto=ftp; host=1.2.3.4"); request.setScheme("http"); request.setServerName("example.com"); request.setRequestURI("/rest/mobile/users/1"); HttpRequest httpRequest = new ServletServerHttpRequest(request); UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); assertEquals("https", result.getScheme()); assertEquals("84.198.58.199", result.getHost()); assertEquals("/rest/mobile/users/1", result.getPath()); }
@Override protected void handle(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { OAuth2Authentication oauth = (OAuth2Authentication) authentication; OAuth2AccessToken accessToken = tokenServicesFacade.get() .createToken(ReportPortalClient.ui, oauth.getName(), oauth.getUserAuthentication(), oauth.getOAuth2Request().getExtensions()); MultiValueMap<String, String> query = new LinkedMultiValueMap<>(); query.add("token", accessToken.getValue()); query.add("token_type", accessToken.getTokenType()); URI rqUrl = UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).replacePath("/ui/authSuccess.html") .replaceQueryParams(query).build().toUri(); eventPublisher.publishEvent(new UiUserSignedInEvent(authentication)); getRedirectStrategy().sendRedirect(request, response, rqUrl.toString()); }
@Before public void setup() throws Exception { MockitoAnnotations.initMocks(this); this.server = new HttpTunnelServer(this.serverConnection); given(this.serverConnection.open(anyInt())).willAnswer(new Answer<ByteChannel>() { @Override public ByteChannel answer(InvocationOnMock invocation) throws Throwable { MockServerChannel channel = HttpTunnelServerTests.this.serverChannel; channel.setTimeout((Integer) invocation.getArguments()[0]); return channel; } }); this.servletRequest = new MockHttpServletRequest(); this.servletRequest.setAsyncSupported(true); this.servletResponse = new MockHttpServletResponse(); this.request = new ServletServerHttpRequest(this.servletRequest); this.response = new ServletServerHttpResponse(this.servletResponse); this.serverChannel = new MockServerChannel(); }
@Test public void handledByDispatcher() throws Exception { HttpServletRequest request = new MockHttpServletRequest("GET", "/hello"); HttpServletResponse response = new MockHttpServletResponse(); willReturn(true).given(this.dispatcher).handle(any(ServerHttpRequest.class), any(ServerHttpResponse.class)); this.filter.doFilter(request, response, this.chain); verifyZeroInteractions(this.chain); verify(this.dispatcher).handle(this.serverRequestCaptor.capture(), this.serverResponseCaptor.capture()); ServerHttpRequest dispatcherRequest = this.serverRequestCaptor.getValue(); ServletServerHttpRequest actualRequest = (ServletServerHttpRequest) dispatcherRequest; ServerHttpResponse dispatcherResponse = this.serverResponseCaptor.getValue(); ServletServerHttpResponse actualResponse = (ServletServerHttpResponse) dispatcherResponse; assertThat(actualRequest.getServletRequest()).isEqualTo(request); assertThat(actualResponse.getServletResponse()).isEqualTo(response); }
public String build() { String url = UriComponentsBuilder // .fromHttpRequest(new ServletServerHttpRequest(request))// .replacePath(path) // .replaceQueryParams(params) // .build() // .toUriString(); // this.path = null; this.params.clear(); if (url.contains("ngrok.io")) { url = url.replaceFirst(":80", ""); url = url.replaceFirst("http:", "https:"); } return url; }
@Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { String rid = ((ServletServerHttpRequest) request).getServletRequest().getParameter("rid"); String otid = ((ServletServerHttpRequest) request).getServletRequest().getParameter("otid"); if (Strings.isNullOrEmpty(rid) || Strings.isNullOrEmpty(otid)) { return false; } else { attributes.put("rid", rid); attributes.put("otid", otid); return true; } }
@Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { String rid = ((ServletServerHttpRequest) request).getServletRequest().getParameter("rid"); if (Strings.isNullOrEmpty(rid)) { return false; } else { attributes.put("rid", rid); return true; } }
@Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { System.out.println("Before Handshake"); ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; HttpSession session = servletRequest.getServletRequest().getSession(); if(session!=null){ //区分socket连接以定向发送消息 attributes.put("user", session.getAttribute("user")); } return true; }
@Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { if (request instanceof ServletServerHttpRequest) { ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; HttpSession session = servletRequest.getServletRequest().getSession(); attributes.put("cols",servletRequest.getServletRequest().getParameter("cols")); attributes.put("rows",servletRequest.getServletRequest().getParameter("rows")); attributes.put("width",servletRequest.getServletRequest().getParameter("width")); attributes.put("height",servletRequest.getServletRequest().getParameter("height")); attributes.put(SSH_SESSION_ID,session.getAttribute(SSH_SESSION_ID)); attributes.put(HTTP_SESSION_ID,session.getAttribute(HTTP_SESSION_ID)); } return super.beforeHandshake(request,response,wsHandler,attributes); }
/** * 重写callback方法,使即支持jsonp格式也支持json格式 */ @Override protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaType contentType, MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) { HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest(); //如果不存在callback这个请求参数,直接返回,不需要处理为jsonp if (ObjectUtils.isEmpty(servletRequest.getParameter("callback"))) { return; } //按设定的请求参数(JsonAdvice构造方法中的this.jsonpQueryParamNames = new String[]{"callback"};),处理返回结果为jsonp格式 for (String name : this.jsonpQueryParamNames) { String value = servletRequest.getParameter(name); if (value != null) { if (!isValidJsonpQueryParam(value)) { if (logger.isDebugEnabled()) { logger.debug("Ignoring invalid jsonp parameter value: " + value); } continue; } MediaType contentTypeToUse = getContentType(contentType, request, response); response.getHeaders().setContentType(contentTypeToUse); bodyContainer.setJsonpFunction(value); return; } } }
@Override public ApiResponse beforeBodyWrite(ApiResponse body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if (request instanceof ServletServerHttpRequest) { ServletServerHttpRequest servletServerHttpRequest = (ServletServerHttpRequest) request; RequestInfo requestInfo = (RequestInfo) servletServerHttpRequest.getServletRequest().getAttribute(Constants.REQUEST_INFO_TAG); if (requestInfo != null) { RequestStatistics.getSingleton().complete(requestInfo); } } return body; }
public WxRequest(HttpServletRequest request, WxSessionManager wxSessionManager) throws IOException { this.request = request; this.wxSessionManager = wxSessionManager; // ServletWebRequest body = (Body) xmlConverter.read(Body.class, new ServletServerHttpRequest(request)); requestUrl = request.getRequestURL().toString(); requestUri = request.getRequestURI(); WxWebUtils.setWxRequestToRequest(request, this); }
@Override public WxMessage beforeBodyWrite(WxMessage body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if (!(request instanceof ServletServerHttpRequest) || body == null) { return body; } HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest(); WxRequest wxRequest = WxWebUtils.getWxRequestFromRequest(servletRequest); return wxMessageProcessor.process(new WxRequestMessageParameter(wxRequest), body); }
@Override public String beforeBodyWrite(String body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if (!(request instanceof ServletServerHttpRequest) || StringUtils.isEmpty(body)) { return null; } HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest(); WxRequest wxRequest = WxWebUtils.getWxRequestFromRequest(servletRequest); WxUserMessage text = WxMessage.Text.builder().content(body).build(); return parseXml(wxMessageProcessor.process(new WxRequestMessageParameter(wxRequest), text)); }
@Override protected void beforeBodyWriteInternal(final MappingJacksonValue bodyContainer, final MediaType contentType, final MethodParameter returnType, final ServerHttpRequest request, final ServerHttpResponse response) { final HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest(); if (isGET(servletRequest) && isJsonpURI(servletRequest)) { super.beforeBodyWriteInternal(bodyContainer, contentType, returnType, request, response); } }
@SuppressWarnings({ "unchecked", "rawtypes", "resource" }) private ModelAndView handleResponseBody(Object returnValue, ServletWebRequest webRequest) throws ServletException, IOException { HttpInputMessage inputMessage = new ServletServerHttpRequest(webRequest.getRequest()); List<MediaType> acceptedMediaTypes = inputMessage.getHeaders().getAccept(); if (acceptedMediaTypes.isEmpty()) { acceptedMediaTypes = Collections.singletonList(MediaType.ALL); } MediaType.sortByQualityValue(acceptedMediaTypes); HttpOutputMessage outputMessage = new ServletServerHttpResponse(webRequest.getResponse()); Class<?> returnValueType = returnValue.getClass(); if (this.messageConverters != null) { for (MediaType acceptedMediaType : acceptedMediaTypes) { for (HttpMessageConverter messageConverter : this.messageConverters) { if (messageConverter.canWrite(returnValueType, acceptedMediaType)) { messageConverter.write(returnValue, acceptedMediaType, outputMessage); return new ModelAndView(); } } } } if (logger.isWarnEnabled()) { logger.warn("Could not find HttpMessageConverter that supports return type [" + returnValueType + "] and " + acceptedMediaTypes); } return null; }
/** * Writes the given return value to the given web request. Delegates to * {@link #writeWithMessageConverters(Object, MethodParameter, ServletServerHttpRequest, ServletServerHttpResponse)} */ protected <T> void writeWithMessageConverters(T returnValue, MethodParameter returnType, NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException { ServletServerHttpRequest inputMessage = createInputMessage(webRequest); ServletServerHttpResponse outputMessage = createOutputMessage(webRequest); writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage); }
@Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { mavContainer.setRequestHandled(true); if (returnValue == null) { return; } ServletServerHttpRequest inputMessage = createInputMessage(webRequest); ServletServerHttpResponse outputMessage = createOutputMessage(webRequest); Assert.isInstanceOf(HttpEntity.class, returnValue); HttpEntity<?> responseEntity = (HttpEntity<?>) returnValue; HttpHeaders entityHeaders = responseEntity.getHeaders(); if (!entityHeaders.isEmpty()) { outputMessage.getHeaders().putAll(entityHeaders); } Object body = responseEntity.getBody(); if (responseEntity instanceof ResponseEntity) { outputMessage.setStatusCode(((ResponseEntity<?>) responseEntity).getStatusCode()); if (HttpMethod.GET == inputMessage.getMethod() && isResourceNotModified(inputMessage, outputMessage)) { outputMessage.setStatusCode(HttpStatus.NOT_MODIFIED); // Ensure headers are flushed, no body should be written. outputMessage.flush(); // Skip call to converters, as they may update the body. return; } } // Try even with null body. ResponseBodyAdvice could get involved. writeWithMessageConverters(body, returnType, inputMessage, outputMessage); // Ensure headers are flushed even if no body was written. outputMessage.flush(); }
/** * No handler found -> set appropriate HTTP response status. * @param request current HTTP request * @param response current HTTP response * @throws Exception if preparing the response failed */ protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception { if (pageNotFoundLogger.isWarnEnabled()) { pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + getRequestUri(request) + "] in DispatcherServlet with name '" + getServletName() + "'"); } if (this.throwExceptionIfNoHandlerFound) { throw new NoHandlerFoundException(request.getMethod(), getRequestUri(request), new ServletServerHttpRequest(request).getHeaders()); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } }