/* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package sun.net.httpserver; import java.io.*; import javax.net.ssl.*; import java.nio.channels.*; import java.lang.System.Logger; import java.lang.System.Logger.Level; import com.sun.net.httpserver.*; import com.sun.net.httpserver.spi.*; /** * encapsulates all the connection specific state for a HTTP/S connection * one of these is hung from the selector attachment and is used to locate * everything from that. */ class HttpConnection { HttpContextImpl context; SSLEngine engine; SSLContext sslContext; SSLStreams sslStreams; /* high level streams returned to application */ InputStream i; /* low level stream that sits directly over channel */ InputStream raw; OutputStream rawout; SocketChannel chan; SelectionKey selectionKey; String protocol; long time; volatile long creationTime; // time this connection was created volatile long rspStartedTime; // time we started writing the response int remaining; boolean closed = false; Logger logger; public enum State {IDLE, REQUEST, RESPONSE}; volatile State state; public String toString() { String s = null; if (chan != null) { s = chan.toString(); } return s; } HttpConnection () { } void setChannel (SocketChannel c) { chan = c; } void setContext (HttpContextImpl ctx) { context = ctx; } State getState() { return state; } void setState (State s) { state = s; } void setParameters ( InputStream in, OutputStream rawout, SocketChannel chan, SSLEngine engine, SSLStreams sslStreams, SSLContext sslContext, String protocol, HttpContextImpl context, InputStream raw ) { this.context = context; this.i = in; this.rawout = rawout; this.raw = raw; this.protocol = protocol; this.engine = engine; this.chan = chan; this.sslContext = sslContext; this.sslStreams = sslStreams; this.logger = context.getLogger(); } SocketChannel getChannel () { return chan; } synchronized void close () { if (closed) { return; } closed = true; if (logger != null && chan != null) { logger.log (Level.TRACE, "Closing connection: " + chan.toString()); } if (!chan.isOpen()) { ServerImpl.dprint ("Channel already closed"); return; } try { /* need to ensure temporary selectors are closed */ if (raw != null) { raw.close(); } } catch (IOException e) { ServerImpl.dprint (e); } try { if (rawout != null) { rawout.close(); } } catch (IOException e) { ServerImpl.dprint (e); } try { if (sslStreams != null) { sslStreams.close(); } } catch (IOException e) { ServerImpl.dprint (e); } try { chan.close(); } catch (IOException e) { ServerImpl.dprint (e); } } /* remaining is the number of bytes left on the lowest level inputstream * after the exchange is finished */ void setRemaining (int r) { remaining = r; } int getRemaining () { return remaining; } SelectionKey getSelectionKey () { return selectionKey; } InputStream getInputStream () { return i; } OutputStream getRawOutputStream () { return rawout; } String getProtocol () { return protocol; } SSLEngine getSSLEngine () { return engine; } SSLContext getSSLContext () { return sslContext; } HttpContextImpl getHttpContext () { return context; } }