// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.http.spi; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.URI; import java.net.URISyntaxException; import java.util.Enumeration; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpPrincipal; /** * Jetty implementation of {@link com.sun.net.httpserver.HttpExchange} */ public class JettyHttpExchangeDelegate extends HttpExchange { private HttpContext _httpContext; private HttpServletRequest _req; private HttpServletResponse _resp; private Headers _responseHeaders = new Headers(); private int _responseCode = 0; private InputStream _is; private OutputStream _os; private HttpPrincipal _httpPrincipal; JettyHttpExchangeDelegate(HttpContext jaxWsContext, HttpServletRequest req, HttpServletResponse resp) { this._httpContext = jaxWsContext; this._req = req; this._resp = resp; try { this._is = req.getInputStream(); this._os = resp.getOutputStream(); } catch (IOException ex) { throw new RuntimeException(ex); } } @Override public Headers getRequestHeaders() { Headers headers = new Headers(); Enumeration<?> en = _req.getHeaderNames(); while (en.hasMoreElements()) { String name = (String)en.nextElement(); Enumeration<?> en2 = _req.getHeaders(name); while (en2.hasMoreElements()) { String value = (String)en2.nextElement(); headers.add(name,value); } } return headers; } @Override public Headers getResponseHeaders() { return _responseHeaders; } @Override public URI getRequestURI() { try { String uriAsString = _req.getRequestURI(); if (_req.getQueryString() != null) { uriAsString += "?" + _req.getQueryString(); } return new URI(uriAsString); } catch (URISyntaxException ex) { throw new RuntimeException(ex); } } @Override public String getRequestMethod() { return _req.getMethod(); } @Override public HttpContext getHttpContext() { return _httpContext; } @Override public void close() { try { _resp.getOutputStream().close(); } catch (IOException ex) { throw new RuntimeException(ex); } } @Override public InputStream getRequestBody() { return _is; } @Override public OutputStream getResponseBody() { return _os; } @Override public void sendResponseHeaders(int rCode, long responseLength) throws IOException { this._responseCode = rCode; for (Map.Entry<String, List<String>> stringListEntry : _responseHeaders.entrySet()) { String name = stringListEntry.getKey(); List<String> values = stringListEntry.getValue(); for (String value : values) { _resp.setHeader(name,value); } } if (responseLength > 0) { _resp.setHeader("content-length","" + responseLength); } _resp.setStatus(rCode); } @Override public InetSocketAddress getRemoteAddress() { return new InetSocketAddress(_req.getRemoteAddr(),_req.getRemotePort()); } @Override public int getResponseCode() { return _responseCode; } @Override public InetSocketAddress getLocalAddress() { return new InetSocketAddress(_req.getLocalAddr(),_req.getLocalPort()); } @Override public String getProtocol() { return _req.getProtocol(); } @Override public Object getAttribute(String name) { return _req.getAttribute(name); } @Override public void setAttribute(String name, Object value) { _req.setAttribute(name,value); } @Override public void setStreams(InputStream i, OutputStream o) { _is = i; _os = o; } @Override public HttpPrincipal getPrincipal() { return _httpPrincipal; } public void setPrincipal(HttpPrincipal principal) { this._httpPrincipal = principal; } }