httphandlercontainer.java

来自「resetful样式的ws样例,一种面向资源的webservices服务」· Java 代码 · 共 194 行

JAVA
194
字号
/* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. *  * Copyright 1997-2007 Sun Microsystems, Inc. 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 https://jersey.dev.java.net/CDDL+GPL.html * or jersey/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 jersey/legal/LICENSE.txt. * Sun designates this particular file as subject to the "Classpath" exception * as provided by Sun in the GPL Version 2 section of the License file that * accompanied this code.  If applicable, add the following below the License * Header, with the fields enclosed by brackets [] replaced by your own * identifying information: "Portions Copyrighted [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.impl.container.httpserver;import com.sun.net.httpserver.HttpExchange;import com.sun.net.httpserver.HttpHandler;import com.sun.jersey.api.container.ContainerException;import com.sun.jersey.spi.container.ContainerListener;import com.sun.jersey.spi.container.ContainerRequest;import com.sun.jersey.spi.container.ContainerResponse;import com.sun.jersey.spi.container.ContainerResponseWriter;import com.sun.jersey.spi.container.InBoundHeaders;import com.sun.jersey.spi.container.WebApplication;import com.sun.net.httpserver.Headers;import com.sun.net.httpserver.HttpServer;import com.sun.net.httpserver.HttpsServer;import java.io.IOException;import java.io.OutputStream;import java.net.InetSocketAddress;import java.net.URI;import java.net.URISyntaxException;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Map.Entry;import javax.ws.rs.core.UriBuilder;/** * A {@link HttpHandler} for a {@link WebApplicationImpl}. *  * @author Paul.Sandoz@Sun.Com */public class HttpHandlerContainer implements HttpHandler, ContainerListener {        private WebApplication application;        public HttpHandlerContainer(WebApplication app) throws ContainerException {        this.application = app;    }        private final static class Writer implements ContainerResponseWriter {        final HttpExchange exchange;                Writer(HttpExchange exchange) {            this.exchange = exchange;        }                public OutputStream writeStatusAndHeaders(long contentLength,                 ContainerResponse cResponse) throws IOException {            Headers eh = exchange.getResponseHeaders();            for (Map.Entry<String, List<Object>> e : cResponse.getHttpHeaders().entrySet()) {                List<String> values = new ArrayList<String>();                for (Object v : e.getValue())                    values.add(ContainerResponse.getHeaderValue(v));                eh.put(e.getKey(), values);            }                        if (cResponse.getEntity() == null && !cResponse.isCommitted()) {                exchange.sendResponseHeaders(cResponse.getStatus(), -1);                            } else {                exchange.sendResponseHeaders(cResponse.getStatus(),                         contentLength == -1 ? 0 : contentLength);                            }                        return exchange.getResponseBody();        }    }        public void handle(HttpExchange exchange) throws IOException {        WebApplication _application = 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).                        path("/").build();            }            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?         */        HttpServer server = exchange.getHttpContext().getServer();        String scheme = (server instanceof HttpsServer) ? "https" : "http";        InetSocketAddress addr = exchange.getLocalAddress();        URI baseUri = null;        try {            baseUri = new URI(scheme, null, addr.getHostName(), addr.getPort(),                     decodedBasePath, null, null);        } catch (URISyntaxException ex) {            throw new IllegalArgumentException(ex);        }                    final URI requestUri = baseUri.resolve(exchangeUri);                                final ContainerRequest cRequest = new ContainerRequest(                _application,                exchange.getRequestMethod(),                baseUri,                requestUri,                getHeaders(exchange),                exchange.getRequestBody()                );                try {            _application.handleRequest(cRequest, new Writer(exchange));        } catch (RuntimeException e) {            e.printStackTrace();            exchange.getResponseHeaders().clear();            exchange.sendResponseHeaders(500, -1);        }           exchange.getResponseBody().flush();        exchange.getResponseBody().close();        exchange.close();                        }        private InBoundHeaders getHeaders(HttpExchange exchange) {        InBoundHeaders rh = new InBoundHeaders();                Headers eh = exchange.getRequestHeaders();        for (Entry<String, List<String>> e : eh.entrySet()) {            rh.put(e.getKey(), e.getValue());        }                return rh;    }        // ContainerListener        public void onReload() {        application = application.clone();    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?