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.util.EventListener;
22
23 import org.eclipse.jetty.util.log.Log;
24 import org.eclipse.jetty.util.log.Logger;
25
26 /**
27 * <p>A {@link SessionFrameListener} is the passive counterpart of a {@link Session} and receives events happening
28 * on a SPDY session.</p>
29 *
30 * @see Session
31 */
32 public interface SessionFrameListener extends EventListener
33 {
34 /**
35 * <p>Callback invoked when a request to create a stream has been received.</p>
36 * <p>Application code should implement this method and reply to the stream creation, eventually
37 * sending data:</p>
38 * <pre>
39 * public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
40 * {
41 * // Do something with the metadata contained in synInfo
42 *
43 * if (stream.isHalfClosed()) // The other peer will not send data
44 * {
45 * stream.reply(new ReplyInfo(false));
46 * stream.data(new StringDataInfo("foo", true));
47 * return null; // Not interested in further stream events
48 * }
49 *
50 * ...
51 * }
52 * </pre>
53 * <p>Alternatively, if the stream creation requires reading data sent from the other peer:</p>
54 * <pre>
55 * public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
56 * {
57 * // Do something with the metadata contained in synInfo
58 *
59 * if (!stream.isHalfClosed()) // The other peer will send data
60 * {
61 * stream.reply(new ReplyInfo(true));
62 * return new Stream.FrameListener.Adapter() // Interested in stream events
63 * {
64 * public void onData(Stream stream, DataInfo dataInfo)
65 * {
66 * // Do something with the incoming data in dataInfo
67 * }
68 * };
69 * }
70 *
71 * ...
72 * }
73 * </pre>
74 *
75 * @param stream the stream just created
76 * @param synInfo the metadata sent on stream creation
77 * @return a listener for stream events, or null if there is no interest in being notified of stream events
78 */
79 public StreamFrameListener onSyn(Stream stream, SynInfo synInfo);
80
81 /**
82 * <p>Callback invoked when a stream error happens.</p>
83 *
84 * @param session the session
85 * @param rstInfo the metadata of the stream error
86 */
87 public void onRst(Session session, RstInfo rstInfo);
88
89 /**
90 * <p>Callback invoked when a request to configure the SPDY connection has been received.</p>
91 *
92 * @param session the session
93 * @param settingsInfo the metadata sent to configure
94 */
95 public void onSettings(Session session, SettingsInfo settingsInfo);
96
97 /**
98 * <p>Callback invoked when a ping request has completed its round-trip.</p>
99 *
100 * @param session the session
101 * @param pingResultInfo the metadata received
102 */
103 public void onPing(Session session, PingResultInfo pingResultInfo);
104
105 /**
106 * <p>Callback invoked when the other peer signals that it is closing the connection.</p>
107 *
108 * @param session the session
109 * @param goAwayResultInfo the metadata sent
110 */
111 public void onGoAway(Session session, GoAwayResultInfo goAwayResultInfo);
112
113 /**
114 * <p>Callback invoked when an exception is thrown during the processing of an event on a
115 * SPDY session.</p>
116 * <p>Examples of such conditions are invalid frames received, corrupted headers compression state, etc.</p>
117 *
118 * @param x the exception that caused the event processing failure
119 */
120 public void onException(Throwable x);
121
122
123 /**
124 * <p>Empty implementation of {@link SessionFrameListener}</p>
125 */
126 public static class Adapter implements SessionFrameListener
127 {
128 private static final Logger logger = Log.getLogger(Adapter.class);
129
130 @Override
131 public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
132 {
133 return null;
134 }
135
136 @Override
137 public void onRst(Session session, RstInfo rstInfo)
138 {
139 }
140
141 @Override
142 public void onSettings(Session session, SettingsInfo settingsInfo)
143 {
144 }
145
146 @Override
147 public void onPing(Session session, PingResultInfo pingResultInfo)
148 {
149 }
150
151 @Override
152 public void onGoAway(Session session, GoAwayResultInfo goAwayResultInfo)
153 {
154 }
155
156 @Override
157 public void onException(Throwable x)
158 {
159 logger.info("", x);
160 }
161 }
162 }