001/*
002 * Copyright 2002-2017 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      https://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.springframework.web.servlet.mvc.method.annotation;
018
019import javax.servlet.http.HttpServletResponse;
020
021import org.springframework.core.MethodParameter;
022import org.springframework.http.HttpHeaders;
023import org.springframework.http.server.ServletServerHttpResponse;
024import org.springframework.util.Assert;
025import org.springframework.web.context.request.NativeWebRequest;
026import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
027import org.springframework.web.method.support.ModelAndViewContainer;
028
029/**
030 * Handles {@link HttpHeaders} return values.
031 *
032 * @author Stephane Nicoll
033 * @since 4.0.1
034 */
035public class HttpHeadersReturnValueHandler implements HandlerMethodReturnValueHandler {
036
037        @Override
038        public boolean supportsReturnType(MethodParameter returnType) {
039                return HttpHeaders.class.isAssignableFrom(returnType.getParameterType());
040        }
041
042        @Override
043        @SuppressWarnings("resource")
044        public void handleReturnValue(Object returnValue, MethodParameter returnType,
045                        ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
046
047                mavContainer.setRequestHandled(true);
048
049                Assert.state(returnValue instanceof HttpHeaders, "HttpHeaders expected");
050                HttpHeaders headers = (HttpHeaders) returnValue;
051
052                if (!headers.isEmpty()) {
053                        HttpServletResponse servletResponse = webRequest.getNativeResponse(HttpServletResponse.class);
054                        ServletServerHttpResponse outputMessage = new ServletServerHttpResponse(servletResponse);
055                        outputMessage.getHeaders().putAll(headers);
056                        outputMessage.getBody();  // flush headers
057                }
058        }
059
060}