/* * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.http.server.reactive; import java.io.IOException; import java.nio.ByteBuffer; import javax.servlet.AsyncContext; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.HttpOutput; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; /** * {@link ServletHttpHandlerAdapter} extension that uses Jetty APIs for writing * to the response with {@link ByteBuffer}. * * @author Violeta Georgieva * @since 5.0 */ @WebServlet(asyncSupported = true) public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter { public JettyHttpHandlerAdapter(HttpHandler httpHandler) { super(httpHandler); } @Override protected ServerHttpResponse createResponse(HttpServletResponse response, AsyncContext context) throws IOException { return new JettyServerHttpResponse(response, context, getDataBufferFactory(), getBufferSize()); } private static final class JettyServerHttpResponse extends ServletServerHttpResponse { public JettyServerHttpResponse(HttpServletResponse response, AsyncContext context, DataBufferFactory factory, int bufferSize) throws IOException { super(response, context, factory, bufferSize); } @Override protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException { ByteBuffer input = dataBuffer.asByteBuffer(); int len = input.remaining(); ((HttpOutput) getServletResponse().getOutputStream()).write(input); return len; } } }