Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
   * Copyright (c) 2010-2011 Oracle and/or its affiliates. All rights reserved.
   * The contents of this file are subject to the terms of either the GNU
   * General Public License Version 2 only ("GPL") or the Common Development
   * and Distribution License("CDDL") (collectively, the "License").  You
   * may not use this file except in compliance with the License.  You can
  * obtain a copy of the License at
  * or packager/legal/LICENSE.txt.  See the License for the specific
  * language governing permissions and limitations under the License.
  * When distributing the software, include this License Header Notice in each
  * file and include the License file at packager/legal/LICENSE.txt.
  * GPL Classpath Exception:
  * Oracle designates this particular file as subject to the "Classpath"
  * exception as provided by Oracle in the GPL Version 2 section of the License
  * file that accompanied this code.
  * Modifications:
  * If applicable, add the following below the License Header, with the fields
  * enclosed by brackets [] replaced by your own identifying information:
  * "Portions Copyright [year] [name of copyright owner]"
  * Contributor(s):
  * If you wish your version of this file to be governed by only the CDDL or
  * only the GPL Version 2, indicate your decision by adding "[Contributor]
  * elects to include this software in this distribution under the [CDDL or GPL
  * Version 2] license."  If you don't indicate a single choice of license, a
  * recipient has the option to distribute your version of this file under
  * either the CDDL, the GPL Version 2 or to extend the choice of license to
  * its licensees as provided above.  However, if you add GPL Version 2 code
  * and therefore, elected the GPL Version 2 license, then the option applies
  * only if the new code is made subject to such option by the copyright
  * holder.
 package com.sun.jersey.server.impl.container.httpserver;
 import java.util.List;
 import java.util.Map;
 public class HttpHandlerContainer implements HttpHandlerContainerListener {
     private WebApplication application;
     public HttpHandlerContainer(WebApplication appthrows ContainerException {
         this. = app;
     private final static class Writer implements ContainerResponseWriter {
         final HttpExchange exchange;
         Writer(HttpExchange exchange) {
             this. = exchange;
         public OutputStream writeStatusAndHeaders(long contentLength
                 ContainerResponse cResponsethrows IOException {
             Headers eh = .getResponseHeaders();
             for (Map.Entry<StringList<Object>> e : cResponse.getHttpHeaders().entrySet()) {
                 List<Stringvalues = new ArrayList<String>();
                 for (Object v : e.getValue())
                 eh.put(e.getKey(), values);
             if (cResponse.getStatus() == 204) {
                 // Work around bug in LW HTTP server
                .sendResponseHeaders(cResponse.getStatus(), -1);
            } else {
            return .getResponseBody();
        public void finish() throws IOException {            
        private long getResponseLength(long contentLength) {
            if (contentLength == 0)
                return -1;
            if (contentLength  < 0)
                return 0;
            return contentLength;
    public void handle(HttpExchange exchangethrows IOException {
        WebApplication _application = ;
This is a URI that contains the path, query and fragment components.
        URI exchangeUri = exchange.getRequestURI();
The base path specified by the HTTP context of the HTTP handler. It is in decoded form.
        String decodedBasePath = exchange.getHttpContext().getPath();
        // Ensure that the base path ends with a '/'
        if (!decodedBasePath.endsWith("/")) {
            if (decodedBasePath.equals(exchangeUri.getPath())) {
This is an edge case where the request path does not end in a '/' and is equal to the context path of the HTTP handler. Both the request path and base path need to end in a '/' Currently the request path is modified. TODO support redirection in accordance with resource configuration feature.
                exchangeUri = UriBuilder.fromUri(exchangeUri).
            decodedBasePath += "/";                
         * The following is madness, there is no easy way to get 
         * the complete URI of the HTTP request!!
         * TODO this is missing the user information component, how
         * can this be obtained?
        String scheme = (exchange instanceof HttpsExchange) ? "https" : "http";
        URI baseUri = null;
        try {
            List<StringhostHeader = exchange.getRequestHeaders().get("Host");
            if (hostHeader != null) {
                StringBuilder sb = new StringBuilder(scheme);
                baseUri = new URI(sb.toString());
            } else {
                InetSocketAddress addr = exchange.getLocalAddress();
                baseUri = new URI(schemenulladdr.getHostName(), addr.getPort(),
        } catch (URISyntaxException ex) {
            throw new IllegalArgumentException(ex);
        final URI requestUri = baseUri.resolve(exchangeUri);
        final ContainerRequest cRequest = new ContainerRequest(
        try {
            _application.handleRequest(cRequestnew Writer(exchange));
        } catch (RuntimeException e) {
            exchange.sendResponseHeaders(500, -1);
        } catch (IOException ex) {
            exchange.sendResponseHeaders(500, -1);
            throw ex;
    private InBoundHeaders getHeaders(HttpExchange exchange) {
        InBoundHeaders rh = new InBoundHeaders();
        Headers eh = exchange.getRequestHeaders();
        for (Entry<StringList<String>> e : eh.entrySet()) {
            rh.put(e.getKey(), e.getValue());
        return rh;
    // ContainerListener
    public void onReload() {
        WebApplication oldApplication = ;
         = .clone();
        if (.getFeaturesAndProperties() instanceof ReloadListener)
New to GrepCode? Check out our FAQ X