//  ========================================================================
//  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.
//  ========================================================================

[[jetty-websocket-api-session]]
=== WebSocket Session

The link:{JDURL}/org/eclipse/jetty/websocket/api/Session.html[Session] object can be used to:

The Connection State (is it open or not).

[source, java, subs="{sub-order}"]
----
if(session.isOpen()) {
  // send message
}
----

Is the Connection Secure.

[source, java, subs="{sub-order}"]
----
if(session.isSecure()) {
  // connection is using 'wss://'
}
----

What was in the Upgrade Request and Response.

[source, java, subs="{sub-order}"]
----
UpgradeRequest req = session.getUpgradeRequest();
String channelName = req.getParameterMap().get("channelName");

UpgradeRespons resp = session.getUpgradeResponse();
String subprotocol = resp.getAcceptedSubProtocol();
----

What is the Local and Remote Address.

[source, java, subs="{sub-order}"]
----
InetSocketAddress remoteAddr = session.getRemoteAddress();
----

Get and Set the Idle Timeout

[source, java, subs="{sub-order}"]
----
session.setIdleTimeout(2000); // 2 second timeout
----
