View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.spdy.api;
20  
21  import java.net.InetSocketAddress;
22  import java.util.EventListener;
23  import java.util.Set;
24  import java.util.concurrent.ExecutionException;
25  import java.util.concurrent.TimeoutException;
26  
27  import org.eclipse.jetty.util.Callback;
28  import org.eclipse.jetty.util.Promise;
29  
30  /**
31   * <p>A {@link Session} represents the client-side endpoint of a SPDY connection to a single origin server.</p>
32   * <p>Once a {@link Session} has been obtained, it can be used to open SPDY streams:</p>
33   * <pre>
34   * Session session = ...;
35   * SynInfo synInfo = new SynInfo(true);
36   * session.push(synInfo, new Stream.FrameListener.Adapter()
37   * {
38   *     public void onReply(Stream stream, ReplyInfo replyInfo)
39   *     {
40   *         // Stream reply received
41   *     }
42   * });
43   * </pre>
44   * <p>A {@link Session} is the active part of the endpoint, and by calling its API applications can generate
45   * events on the connection; conversely {@link SessionFrameListener} is the passive part of the endpoint, and
46   * has callbacks that are invoked when events happen on the connection.</p>
47   *
48   * @see SessionFrameListener
49   */
50  public interface Session
51  {
52      /**
53       * @return the SPDY protocol version used by this session
54       */
55      public short getVersion();
56  
57      /**
58       * <p>Registers the given {@code listener} to be notified of session events.</p>
59       *
60       * @param listener the listener to register
61       * @see #removeListener(Listener)
62       */
63      public void addListener(Listener listener);
64  
65      /**
66       * <p>Deregisters the give {@code listener} from being notified of session events.</p>
67       *
68       * @param listener the listener to deregister
69       * @see #addListener(Listener)
70       */
71      public void removeListener(Listener listener);
72  
73      /**
74       * <p>Sends a SYN_FRAME to create a new {@link Stream SPDY stream}.</p>
75       * <p>Callers may use the returned Stream for example, to send data frames.</p>
76       *
77       * @param synInfo  the metadata to send on stream creation
78       * @param listener the listener to invoke when events happen on the stream just created
79       * @return the stream that will be created
80       * @see #syn(SynInfo, StreamFrameListener, Promise
81       */
82      public Stream syn(SynInfo synInfo, StreamFrameListener listener) throws ExecutionException, InterruptedException, TimeoutException;
83  
84      /**
85       * <p>Sends asynchronously a SYN_FRAME to create a new {@link Stream SPDY stream}.</p>
86       * <p>Callers may pass a non-null completion callback to be notified of when the
87       * stream has been created and use the stream, for example, to send data frames.</p>
88       *
89       *
90       * @param synInfo  the metadata to send on stream creation
91       * @param listener the listener to invoke when events happen on the stream just created
92       * @param promise  the completion callback that gets notified of stream creation
93       * @see #syn(SynInfo, StreamFrameListener)
94       */
95      public void syn(SynInfo synInfo, StreamFrameListener listener, Promise<Stream> promise);
96  
97      /**
98       * <p>Sends synchronously a RST_STREAM to abort a stream.</p>
99       *
100      * @param rstInfo the metadata to reset the stream
101      * @return the RstInfo belonging to the reset to be sent
102      * @see #rst(RstInfo, Callback)
103      */
104     public void rst(RstInfo rstInfo) throws InterruptedException, ExecutionException, TimeoutException;
105 
106     /**
107      * <p>Sends asynchronously a RST_STREAM to abort a stream.</p>
108      * <p>Callers may pass a non-null completion callback to be notified of when the
109      * reset has been actually sent.</p>
110      *
111      * @param rstInfo the metadata to reset the stream
112      * @param callback the completion callback that gets notified of reset's send
113      * @see #rst(RstInfo)
114      */
115     public void rst(RstInfo rstInfo, Callback callback);
116 
117     /**
118      * <p>Sends synchronously a SETTINGS to configure the SPDY connection.</p>
119      *
120      * @param settingsInfo the metadata to send
121      * @see #settings(SettingsInfo, Callback)
122      */
123     public void settings(SettingsInfo settingsInfo) throws ExecutionException, InterruptedException, TimeoutException;
124 
125     /**
126      * <p>Sends asynchronously a SETTINGS to configure the SPDY connection.</p>
127      * <p>Callers may pass a non-null completion callback to be notified of when the
128      * settings has been actually sent.</p>
129      *
130      *
131      * @param settingsInfo the metadata to send
132      * @param callback      the completion callback that gets notified of settings' send
133      * @see #settings(SettingsInfo)
134      */
135     public void settings(SettingsInfo settingsInfo, Callback callback);
136 
137     /**
138      * <p>Sends synchronously a PING, normally to measure round-trip time.</p>
139      *
140      * @see #ping(PingInfo, Promise
141      * @param pingInfo
142      */
143     public PingResultInfo ping(PingInfo pingInfo) throws ExecutionException, InterruptedException, TimeoutException;
144 
145     /**
146      * <p>Sends asynchronously a PING, normally to measure round-trip time.</p>
147      * <p>Callers may pass a non-null completion callback to be notified of when the
148      * ping has been actually sent.</p>
149      *
150      * @param pingInfo
151      * @param promise the completion callback that gets notified of ping's send
152      * @see #ping(PingInfo)
153      */
154     public void ping(PingInfo pingInfo, Promise<PingResultInfo> promise);
155 
156     /**
157      * <p>Closes gracefully this session, sending a GO_AWAY frame and then closing the TCP connection.</p>
158      *
159      * @see #goAway(GoAwayInfo, Callback)
160      * @param goAwayInfo
161      */
162     public void goAway(GoAwayInfo goAwayInfo) throws ExecutionException, InterruptedException, TimeoutException;
163 
164     /**
165      * <p>Closes gracefully this session, sending a GO_AWAY frame and then closing the TCP connection.</p>
166      * <p>Callers may pass a non-null completion callback to be notified of when the
167      * go away has been actually sent.</p>
168      *
169      * @param goAwayInfo
170      * @param callback the completion callback that gets notified of go away's send
171      * @see #goAway(GoAwayInfo)
172      */
173     public void goAway(GoAwayInfo goAwayInfo, Callback callback);
174 
175     /**
176      * @return a snapshot of the streams currently active in this session
177      * @see #getStream(int)
178      */
179     public Set<Stream> getStreams();
180 
181     /**
182      * @param streamId the id of the stream to retrieve
183      * @return the stream with the given stream id
184      * @see #getStreams()
185      */
186     public Stream getStream(int streamId);
187 
188     /**
189      * @param key the attribute key
190      * @return an arbitrary object associated with the given key to this session
191      * @see #setAttribute(String, Object)
192      */
193     public Object getAttribute(String key);
194 
195     /**
196      * @param key   the attribute key
197      * @param value an arbitrary object to associate with the given key to this session
198      * @see #getAttribute(String)
199      * @see #removeAttribute(String)
200      */
201     public void setAttribute(String key, Object value);
202 
203     /**
204      * @param key the attribute key
205      * @return the arbitrary object associated with the given key to this session
206      * @see #setAttribute(String, Object)
207      */
208     public Object removeAttribute(String key);
209 
210     /**
211      * @return the local address of the underlying endpoint
212      */
213     public InetSocketAddress getLocalAddress();
214 
215     /**
216      * @return the remote address of the underlying endpoint
217      */
218     public InetSocketAddress getRemoteAddress();
219 
220     /**
221      * <p>Super interface for listeners with callbacks that are invoked on specific session events.</p>
222      */
223     public interface Listener extends EventListener
224     {
225     }
226 
227     /**
228      * <p>Specialized listener that is invoked upon creation and removal of streams.</p>
229      */
230     public interface StreamListener extends Listener
231     {
232         /**
233          * <p>Callback invoked when a new SPDY stream is created.</p>
234          *
235          * @param stream the stream just created
236          */
237         public void onStreamCreated(Stream stream);
238 
239         /**
240          * <p>Callback invoked when a SPDY stream is closed.</p>
241          *
242          * @param stream the stream just closed.
243          */
244         public void onStreamClosed(Stream stream);
245 
246         /**
247          * <p>Empty implementation of {@link StreamListener}.</p>
248          */
249         public static class Adapter implements StreamListener
250         {
251             @Override
252             public void onStreamCreated(Stream stream)
253             {
254             }
255 
256             @Override
257             public void onStreamClosed(Stream stream)
258             {
259             }
260         }
261     }
262 }