diff --git a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYClient.java b/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYClient.java index d9a1ebb7c64..873369f8bc0 100644 --- a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYClient.java +++ b/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYClient.java @@ -41,8 +41,10 @@ import org.eclipse.jetty.io.SelectorManager; import org.eclipse.jetty.io.ssl.SslConnection; import org.eclipse.jetty.io.ssl.SslConnection.DecryptedEndPoint; import org.eclipse.jetty.spdy.FlowControlStrategy; +import org.eclipse.jetty.spdy.api.GoAwayInfo; import org.eclipse.jetty.spdy.api.Session; import org.eclipse.jetty.spdy.api.SessionFrameListener; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.FuturePromise; import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.ssl.SslContextFactory; @@ -265,7 +267,7 @@ public class SPDYClient private void closeConnections() { for (Session session : sessions) - session.goAway(); + session.goAway(new GoAwayInfo(), new Callback.Adapter()); sessions.clear(); } diff --git a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYConnection.java b/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYConnection.java index 3bf3ac2d01e..b536bdee373 100644 --- a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYConnection.java +++ b/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYConnection.java @@ -29,6 +29,7 @@ import org.eclipse.jetty.io.RuntimeIOException; import org.eclipse.jetty.spdy.Controller; import org.eclipse.jetty.spdy.ISession; import org.eclipse.jetty.spdy.IdleListener; +import org.eclipse.jetty.spdy.api.GoAwayInfo; import org.eclipse.jetty.spdy.parser.Parser; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.log.Log; @@ -46,10 +47,10 @@ public class SPDYConnection extends AbstractConnection implements Controller, Id public SPDYConnection(EndPoint endPoint, ByteBufferPool bufferPool, Parser parser, Executor executor) { - this(endPoint,bufferPool,parser,executor,8192); + this(endPoint, bufferPool, parser, executor, 8192); } - public SPDYConnection(EndPoint endPoint, ByteBufferPool bufferPool, Parser parser, Executor executor,int bufferSize) + public SPDYConnection(EndPoint endPoint, ByteBufferPool bufferPool, Parser parser, Executor executor, int bufferSize) { // Since SPDY is multiplexed, onFillable() must never block // while calling application code. In fact, onFillable() @@ -60,7 +61,7 @@ public class SPDYConnection extends AbstractConnection implements Controller, Id this.bufferPool = bufferPool; this.parser = parser; onIdle(true); - this.bufferSize=bufferSize; + this.bufferSize = bufferSize; } @Override @@ -165,7 +166,7 @@ public class SPDYConnection extends AbstractConnection implements Controller, Id protected void goAway(ISession session) { if (session != null) - session.goAway(); + session.goAway(new GoAwayInfo(), new Callback.Adapter()); } private void shutdown(ISession session) diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardSession.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardSession.java index 64b029df538..dee403b255c 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardSession.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardSession.java @@ -33,9 +33,10 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; -import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -44,7 +45,9 @@ import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.spdy.api.ByteBufferDataInfo; import org.eclipse.jetty.spdy.api.DataInfo; import org.eclipse.jetty.spdy.api.GoAwayInfo; +import org.eclipse.jetty.spdy.api.GoAwayReceivedInfo; import org.eclipse.jetty.spdy.api.PingInfo; +import org.eclipse.jetty.spdy.api.PingResultInfo; import org.eclipse.jetty.spdy.api.RstInfo; import org.eclipse.jetty.spdy.api.SPDYException; import org.eclipse.jetty.spdy.api.Session; @@ -148,15 +151,18 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable } @Override - public Future syn(SynInfo synInfo, StreamFrameListener listener) + public Stream syn(SynInfo synInfo, StreamFrameListener listener) throws ExecutionException, InterruptedException, TimeoutException { FuturePromise result = new FuturePromise<>(); - syn(synInfo,listener,0,TimeUnit.MILLISECONDS,result); - return result; + syn(synInfo, listener, result); + if (synInfo.getTimeout() > 0) + return result.get(synInfo.getTimeout(), synInfo.getUnit()); + else + return result.get(); } @Override - public void syn(SynInfo synInfo, StreamFrameListener listener, long timeout, TimeUnit unit, Promise promise) + public void syn(SynInfo synInfo, StreamFrameListener listener, Promise promise) { // Synchronization is necessary. // SPEC v3, 2.3.1 requires that the stream creation be monotonically crescent @@ -174,21 +180,24 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable // TODO: for SPDYv3 we need to support the "slot" argument SynStreamFrame synStream = new SynStreamFrame(version, synInfo.getFlags(), streamId, associatedStreamId, synInfo.getPriority(), (short)0, synInfo.getHeaders()); IStream stream = createStream(synStream, listener, true, promise); - generateAndEnqueueControlFrame(stream, synStream, timeout, unit, stream); + generateAndEnqueueControlFrame(stream, synStream, synInfo.getTimeout(), synInfo.getUnit(), stream); } flush(); } @Override - public Future rst(RstInfo rstInfo) + public void rst(RstInfo rstInfo) throws InterruptedException, ExecutionException, TimeoutException { FutureCallback result = new FutureCallback(); - rst(rstInfo,0,TimeUnit.MILLISECONDS,result); - return result; + rst(rstInfo, result); + if (rstInfo.getTimeout() > 0) + result.get(rstInfo.getTimeout(), rstInfo.getUnit()); + else + result.get(); } @Override - public void rst(RstInfo rstInfo, long timeout, TimeUnit unit, Callback callback) + public void rst(RstInfo rstInfo, Callback callback) { // SPEC v3, 2.2.2 if (goAwaySent.get()) @@ -199,8 +208,8 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable { int streamId = rstInfo.getStreamId(); IStream stream = streams.get(streamId); - RstStreamFrame frame = new RstStreamFrame(version,streamId,rstInfo.getStreamStatus().getCode(version)); - control(stream,frame,timeout,unit,callback); + RstStreamFrame frame = new RstStreamFrame(version, streamId, rstInfo.getStreamStatus().getCode(version)); + control(stream, frame, rstInfo.getTimeout(), rstInfo.getUnit(), callback); if (stream != null) { stream.process(frame); @@ -210,64 +219,74 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable } @Override - public Future settings(SettingsInfo settingsInfo) + public void settings(SettingsInfo settingsInfo) throws ExecutionException, InterruptedException, TimeoutException { FutureCallback result = new FutureCallback(); - settings(settingsInfo, 0, TimeUnit.MILLISECONDS, result); - return result; + settings(settingsInfo, result); + if (settingsInfo.getTimeout() > 0) + result.get(settingsInfo.getTimeout(), settingsInfo.getUnit()); + else + result.get(); } @Override - public void settings(SettingsInfo settingsInfo, long timeout, TimeUnit unit, Callback callback) + public void settings(SettingsInfo settingsInfo, Callback callback) { - SettingsFrame frame = new SettingsFrame(version,settingsInfo.getFlags(),settingsInfo.getSettings()); - control(null, frame, timeout, unit, callback); + SettingsFrame frame = new SettingsFrame(version, settingsInfo.getFlags(), settingsInfo.getSettings()); + control(null, frame, settingsInfo.getTimeout(), settingsInfo.getUnit(), callback); } @Override - public Future ping() + public PingResultInfo ping(PingInfo pingInfo) throws ExecutionException, InterruptedException, TimeoutException { - FuturePromise result = new FuturePromise<>(); - ping(0, TimeUnit.MILLISECONDS, result); - return result; + //TODO: find a better name for PingResultInfo + FuturePromise result = new FuturePromise<>(); + ping(pingInfo, result); + if (pingInfo.getTimeout() > 0) + return result.get(pingInfo.getTimeout(), pingInfo.getUnit()); + else + return result.get(); } @Override - public void ping(long timeout, TimeUnit unit, Promise promise) + public void ping(PingInfo pingInfo, Promise promise) { int pingId = pingIds.getAndAdd(2); - PingInfoCallback pingInfo = new PingInfoCallback(pingId, promise); + PingInfoCallback pingInfoCallback = new PingInfoCallback(pingId, promise); PingFrame frame = new PingFrame(version, pingId); - control(null, frame, timeout, unit, pingInfo); + control(null, frame, pingInfo.getTimeout(), pingInfo.getUnit(), pingInfoCallback); } @Override - public Future goAway() + public void goAway(GoAwayInfo goAwayInfo) throws ExecutionException, InterruptedException, TimeoutException { - return goAway(SessionStatus.OK); + goAway(goAwayInfo, SessionStatus.OK); } - private Future goAway(SessionStatus sessionStatus) + private void goAway(GoAwayInfo goAwayInfo, SessionStatus sessionStatus) throws ExecutionException, InterruptedException, TimeoutException { FutureCallback result = new FutureCallback(); - goAway(sessionStatus, 0, TimeUnit.MILLISECONDS, result); - return result; + goAway(sessionStatus, goAwayInfo.getTimeout(), goAwayInfo.getUnit(), result); + if (goAwayInfo.getTimeout() > 0) + result.get(goAwayInfo.getTimeout(), goAwayInfo.getUnit()); + else + result.get(); } @Override - public void goAway(long timeout, TimeUnit unit, Callback callback) + public void goAway(GoAwayInfo goAwayInfo, Callback callback) { - goAway(SessionStatus.OK, timeout, unit, callback); + goAway(SessionStatus.OK, goAwayInfo.getTimeout(), goAwayInfo.getUnit(), callback); } private void goAway(SessionStatus sessionStatus, long timeout, TimeUnit unit, Callback callback) { - if (goAwaySent.compareAndSet(false,true)) + if (goAwaySent.compareAndSet(false, true)) { if (!goAwayReceived.get()) { - GoAwayFrame frame = new GoAwayFrame(version,lastStreamId.get(),sessionStatus.getCode()); - control(null,frame,timeout,unit,callback); + GoAwayFrame frame = new GoAwayFrame(version, lastStreamId.get(), sessionStatus.getCode()); + control(null, frame, timeout, unit, callback); return; } } @@ -416,7 +435,7 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable { RstInfo rstInfo = new RstInfo(streamId, StreamStatus.INVALID_STREAM); LOG.debug("Unknown stream {}", rstInfo); - rst(rstInfo); + rst(rstInfo, new Callback.Adapter()); } else { @@ -437,7 +456,7 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable private void processData(final IStream stream, DataFrame frame, ByteBuffer data) { - ByteBufferDataInfo dataInfo = new ByteBufferDataInfo(data, frame.isClose(), frame.isCompress()) + ByteBufferDataInfo dataInfo = new ByteBufferDataInfo(data, frame.isClose()) { @Override public void consume(int delta) @@ -456,15 +475,15 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable public void onStreamException(StreamException x) { notifyOnException(listener, x); - rst(new RstInfo(x.getStreamId(),x.getStreamStatus())); + rst(new RstInfo(x.getStreamId(), x.getStreamStatus()), new Callback.Adapter()); } @Override public void onSessionException(SessionException x) { Throwable cause = x.getCause(); - notifyOnException(listener,cause == null?x:cause); - goAway(x.getSessionStatus()); + notifyOnException(listener, cause == null ? x : cause); + goAway(x.getSessionStatus(), 0, TimeUnit.SECONDS, new Callback.Adapter()); } private void onSyn(SynStreamFrame frame) @@ -479,8 +498,8 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable stream.process(frame); // Update the last stream id before calling the application (which may send a GO_AWAY) updateLastStreamId(stream); - SynInfo synInfo = new SynInfo(frame.getHeaders(),frame.isClose(),frame.getPriority()); - StreamFrameListener streamListener = notifyOnSyn(listener,stream,synInfo); + SynInfo synInfo = new SynInfo(frame.getHeaders(), frame.isClose(), frame.getPriority()); + StreamFrameListener streamListener = notifyOnSyn(listener, stream, synInfo); stream.setStreamFrameListener(streamListener); flush(); // The onSyn() listener may have sent a frame that closed the stream @@ -512,7 +531,14 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable throw new IllegalStateException("Duplicate stream id " + streamId); RstInfo rstInfo = new RstInfo(streamId, StreamStatus.PROTOCOL_ERROR); LOG.debug("Duplicate stream, {}", rstInfo); - rst(rstInfo); + try + { + rst(rstInfo); + } + catch (InterruptedException | ExecutionException | TimeoutException e) + { + e.printStackTrace(); // TODO: really catch??? + } return null; } else @@ -589,13 +615,13 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable IStream stream = streams.get(streamId); if (stream == null) { - RstInfo rstInfo = new RstInfo(streamId,StreamStatus.INVALID_STREAM); - LOG.debug("Unknown stream {}",rstInfo); - rst(rstInfo); + RstInfo rstInfo = new RstInfo(streamId, StreamStatus.INVALID_STREAM); + LOG.debug("Unknown stream {}", rstInfo); + rst(rstInfo, new Callback.Adapter()); } else { - processReply(stream,frame); + processReply(stream, frame); } } @@ -613,7 +639,7 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable if (stream != null) stream.process(frame); - RstInfo rstInfo = new RstInfo(frame.getStreamId(),StreamStatus.from(frame.getVersion(),frame.getStatusCode())); + RstInfo rstInfo = new RstInfo(frame.getStreamId(), StreamStatus.from(frame.getVersion(), frame.getStatusCode())); notifyOnRst(listener, rstInfo); flush(); @@ -640,8 +666,8 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable int pingId = frame.getPingId(); if (pingId % 2 == pingIds.get() % 2) { - PingInfo pingInfo = new PingInfo(frame.getPingId()); - notifyOnPing(listener, pingInfo); + PingResultInfo pingResultInfo = new PingResultInfo(frame.getPingId()); + notifyOnPing(listener, pingResultInfo); flush(); } else @@ -654,8 +680,9 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable { if (goAwayReceived.compareAndSet(false, true)) { - GoAwayInfo goAwayInfo = new GoAwayInfo(frame.getLastStreamId(),SessionStatus.from(frame.getStatusCode())); - notifyOnGoAway(listener,goAwayInfo); + //TODO: Find a better name for GoAwayReceivedInfo + GoAwayReceivedInfo goAwayReceivedInfo = new GoAwayReceivedInfo(frame.getLastStreamId(), SessionStatus.from(frame.getStatusCode())); + notifyOnGoAway(listener, goAwayReceivedInfo); flush(); // SPDY does not require to send back a response to a GO_AWAY. // We notified the application of the last good stream id and @@ -669,13 +696,13 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable IStream stream = streams.get(streamId); if (stream == null) { - RstInfo rstInfo = new RstInfo(streamId,StreamStatus.INVALID_STREAM); - LOG.debug("Unknown stream, {}",rstInfo); - rst(rstInfo); + RstInfo rstInfo = new RstInfo(streamId, StreamStatus.INVALID_STREAM); + LOG.debug("Unknown stream, {}", rstInfo); + rst(rstInfo, new Callback.Adapter()); } else { - processHeaders(stream,frame); + processHeaders(stream, frame); } } @@ -713,7 +740,7 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable { if (listener != null) { - LOG.debug("Invoking callback with {} on listener {}",x,listener); + LOG.debug("Invoking callback with {} on listener {}", x, listener); listener.onException(x); } } @@ -734,12 +761,12 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable { if (listener == null) return null; - LOG.debug("Invoking callback with {} on listener {}",synInfo,listener); - return listener.onSyn(stream,synInfo); + LOG.debug("Invoking callback with {} on listener {}", synInfo, listener); + return listener.onSyn(stream, synInfo); } catch (Exception x) { - LOG.info("Exception while notifying listener " + listener,x); + LOG.info("Exception while notifying listener " + listener, x); return null; } catch (Error x) @@ -755,8 +782,8 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable { if (listener != null) { - LOG.debug("Invoking callback with {} on listener {}",rstInfo,listener); - listener.onRst(this,rstInfo); + LOG.debug("Invoking callback with {} on listener {}", rstInfo, listener); + listener.onRst(this, rstInfo); } } catch (Exception x) @@ -776,7 +803,7 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable { if (listener != null) { - LOG.debug("Invoking callback with {} on listener {}",settingsInfo,listener); + LOG.debug("Invoking callback with {} on listener {}", settingsInfo, listener); listener.onSettings(this, settingsInfo); } } @@ -791,14 +818,14 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable } } - private void notifyOnPing(SessionFrameListener listener, PingInfo pingInfo) + private void notifyOnPing(SessionFrameListener listener, PingResultInfo pingResultInfo) { try { if (listener != null) { - LOG.debug("Invoking callback with {} on listener {}",pingInfo,listener); - listener.onPing(this, pingInfo); + LOG.debug("Invoking callback with {} on listener {}", pingResultInfo, listener); + listener.onPing(this, pingResultInfo); } } catch (Exception x) @@ -812,14 +839,14 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable } } - private void notifyOnGoAway(SessionFrameListener listener, GoAwayInfo goAwayInfo) + private void notifyOnGoAway(SessionFrameListener listener, GoAwayReceivedInfo goAwayReceivedInfo) { try { if (listener != null) { - LOG.debug("Invoking callback with {} on listener {}",goAwayInfo,listener); - listener.onGoAway(this, goAwayInfo); + LOG.debug("Invoking callback with {} on listener {}", goAwayReceivedInfo, listener); + listener.onGoAway(this, goAwayReceivedInfo); } } catch (Exception x) @@ -879,10 +906,10 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable @Override public void data(IStream stream, DataInfo dataInfo, long timeout, TimeUnit unit, Callback callback) { - LOG.debug("Queuing {} on {}",dataInfo,stream); - DataFrameBytes frameBytes = new DataFrameBytes(stream,callback,dataInfo); + LOG.debug("Queuing {} on {}", dataInfo, stream); + DataFrameBytes frameBytes = new DataFrameBytes(stream, callback, dataInfo); if (timeout > 0) - frameBytes.task = scheduler.schedule(frameBytes,timeout,unit); + frameBytes.task = scheduler.schedule(frameBytes, timeout, unit); append(frameBytes); flush(); } @@ -909,7 +936,7 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable { if (flushing || queue.isEmpty()) return; - + Set stalledStreams = null; for (int i = 0; i < queue.size(); ++i) { @@ -937,14 +964,14 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable if (stream != null) stalledStreams.add(stream); - LOG.debug("Flush stalled for {}, {} frame(s) in queue",frameBytes,queue.size()); + LOG.debug("Flush stalled for {}, {} frame(s) in queue", frameBytes, queue.size()); } if (buffer == null) return; flushing = true; - LOG.debug("Flushing {}, {} frame(s) in queue",frameBytes,queue.size()); + LOG.debug("Flushing {}, {} frame(s) in queue", frameBytes, queue.size()); } write(buffer, frameBytes); } @@ -996,7 +1023,7 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable break; ++index; } - queue.add(index,frameBytes); + queue.add(index, frameBytes); } } @@ -1008,8 +1035,8 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable { if (controller != null) { - LOG.debug("Writing {} frame bytes of {}",buffer.remaining()); - controller.write(buffer,callback); + LOG.debug("Writing {} frame bytes of {}", buffer.remaining(), buffer.limit()); + controller.write(buffer, callback); } } @@ -1053,7 +1080,8 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable @Override public String toString() { - return String.format("%s@%x{v%d,queuSize=%d,windowSize=%d,streams=%d}", getClass().getSimpleName(), hashCode(), version, queue.size(), getWindowSize(), streams.size()); + return String.format("%s@%x{v%d,queueSize=%d,windowSize=%d,streams=%d}", getClass().getSimpleName(), + hashCode(), version, queue.size(), getWindowSize(), streams.size()); } @Override @@ -1065,8 +1093,8 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable @Override public void dump(Appendable out, String indent) throws IOException { - ContainerLifeCycle.dumpObject(out,this); - ContainerLifeCycle.dump(out,indent,Collections.singletonList(controller),streams.values()); + ContainerLifeCycle.dumpObject(out, this); + ContainerLifeCycle.dump(out, indent, Collections.singletonList(controller), streams.values()); } private class SessionInvoker extends ForkInvoker @@ -1177,7 +1205,7 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable synchronized (queue) { if (LOG.isDebugEnabled()) - LOG.debug("Completed write of {}, {} frame(s) in queue",this,queue.size()); + LOG.debug("Completed write of {}, {} frame(s) in queue", this, queue.size()); flushing = false; } complete(); @@ -1194,8 +1222,8 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable failure = x; if (LOG.isDebugEnabled()) { - String logMessage = String.format("Failed write of %s, failing all %d frame(s) in queue",this,queue.size()); - LOG.debug(logMessage,x); + String logMessage = String.format("Failed write of %s, failing all %d frame(s) in queue", this, queue.size()); + LOG.debug(logMessage, x); } frameBytesToFail.addAll(queue); queue.clear(); @@ -1214,7 +1242,7 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable private ControlFrameBytes(IStream stream, Callback callback, ControlFrame frame, ByteBuffer buffer) { - super(stream,callback); + super(stream, callback); this.frame = frame; this.buffer = buffer; } @@ -1276,7 +1304,7 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable if (size > windowSize) size = windowSize; - buffer = generator.data(stream.getId(),size,dataInfo); + buffer = generator.data(stream.getId(), size, dataInfo); return buffer; } catch (Throwable x) @@ -1303,7 +1331,7 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable else { super.complete(); - stream.updateCloseState(dataInfo.isClose(),true); + stream.updateCloseState(dataInfo.isClose(), true); if (stream.isClosed()) removeStream(stream); } @@ -1337,14 +1365,14 @@ public class StandardSession implements ISession, Parser.Listener, Dumpable } } - private static class PingInfoCallback extends PingInfo implements Callback + private static class PingInfoCallback extends PingResultInfo implements Callback { - private final Promise promise; + private final Promise promise; - public PingInfoCallback(int pingId, Promise promise) + public PingInfoCallback(int pingId, Promise promise) { super(pingId); - this.promise=promise; + this.promise = promise; } @Override diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardStream.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardStream.java index ff0270c54c1..687ab0b590e 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardStream.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardStream.java @@ -22,8 +22,8 @@ import java.util.Collections; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.jetty.spdy.api.DataInfo; @@ -133,7 +133,7 @@ public class StandardStream implements IStream @Override public void setAttribute(String key, Object value) { - attributes.put(key,value); + attributes.put(key, value); } @Override @@ -156,7 +156,7 @@ public class StandardStream implements IStream @Override public void updateCloseState(boolean close, boolean local) { - LOG.debug("{} close={} local={}",this,close,local); + LOG.debug("{} close={} local={}", this, close, local); if (close) { switch (closeState) @@ -184,7 +184,7 @@ public class StandardStream implements IStream } default: { - LOG.warn("Already CLOSED! {} local={}",this,local); + LOG.warn("Already CLOSED! {} local={}", this, local); } } } @@ -243,8 +243,8 @@ public class StandardStream implements IStream if (!canReceive()) { - LOG.debug("Protocol error receiving {}, resetting" + dataInfo); - session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR)); + LOG.debug("Protocol error receiving {}, resetting", dataInfo); + session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new Adapter()); return; } @@ -335,15 +335,18 @@ public class StandardStream implements IStream } @Override - public Future syn(SynInfo synInfo) + public Stream syn(SynInfo synInfo) throws InterruptedException, ExecutionException, TimeoutException { FuturePromise result = new FuturePromise<>(); - syn(synInfo,0,TimeUnit.MILLISECONDS,result); - return result; + syn(synInfo, result); + if (synInfo.getTimeout() > 0) + return result.get(synInfo.getTimeout(), synInfo.getUnit()); + else + return result.get(); } @Override - public void syn(SynInfo synInfo, long timeout, TimeUnit unit, Promise promise) + public void syn(SynInfo synInfo, Promise promise) { if (isClosed() || isReset()) { @@ -352,80 +355,89 @@ public class StandardStream implements IStream return; } PushSynInfo pushSynInfo = new PushSynInfo(getId(), synInfo); - session.syn(pushSynInfo, null, timeout, unit, promise); + session.syn(pushSynInfo, null, promise); } @Override - public Future reply(ReplyInfo replyInfo) + public void reply(ReplyInfo replyInfo) throws InterruptedException, ExecutionException, TimeoutException { FutureCallback result = new FutureCallback(); - reply(replyInfo, 0, TimeUnit.MILLISECONDS, result); - return result; + reply(replyInfo, result); + if (replyInfo.getTimeout() > 0) + result.get(replyInfo.getTimeout(), replyInfo.getUnit()); + else + result.get(); } @Override - public void reply(ReplyInfo replyInfo, long timeout, TimeUnit unit, Callback callback) + public void reply(ReplyInfo replyInfo, Callback callback) { if (isUnidirectional()) throw new IllegalStateException("Protocol violation: cannot send SYN_REPLY frames in unidirectional streams"); openState = OpenState.REPLY_SENT; updateCloseState(replyInfo.isClose(), true); SynReplyFrame frame = new SynReplyFrame(session.getVersion(), replyInfo.getFlags(), getId(), replyInfo.getHeaders()); - session.control(this, frame, timeout, unit, callback); + session.control(this, frame, replyInfo.getTimeout(), replyInfo.getUnit(), callback); } @Override - public Future data(DataInfo dataInfo) + public void data(DataInfo dataInfo) throws InterruptedException, ExecutionException, TimeoutException { FutureCallback result = new FutureCallback(); - data(dataInfo, 0, TimeUnit.MILLISECONDS, result); - return result; + data(dataInfo, result); + if (dataInfo.getTimeout() > 0) + result.get(dataInfo.getTimeout(), dataInfo.getUnit()); + else + result.get(); } @Override - public void data(DataInfo dataInfo, long timeout, TimeUnit unit, Callback callback) + public void data(DataInfo dataInfo, Callback callback) { if (!canSend()) { - session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR)); + session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new Adapter()); throw new IllegalStateException("Protocol violation: cannot send a DATA frame before a SYN_REPLY frame"); } if (isLocallyClosed()) { - session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR)); + session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new Adapter()); throw new IllegalStateException("Protocol violation: cannot send a DATA frame on a closed stream"); } // Cannot update the close state here, because the data that we send may // be flow controlled, so we need the stream to update the window size. - session.data(this, dataInfo, timeout, unit, callback); + session.data(this, dataInfo, dataInfo.getTimeout(), dataInfo.getUnit(), callback); } @Override - public Future headers(HeadersInfo headersInfo) + public void headers(HeadersInfo headersInfo) throws InterruptedException, ExecutionException, TimeoutException { FutureCallback result = new FutureCallback(); - headers(headersInfo, 0, TimeUnit.MILLISECONDS, result); - return result; + headers(headersInfo, result); + if (headersInfo.getTimeout() > 0) + result.get(headersInfo.getTimeout(), headersInfo.getUnit()); + else + result.get(); } @Override - public void headers(HeadersInfo headersInfo, long timeout, TimeUnit unit, Callback callback) + public void headers(HeadersInfo headersInfo, Callback callback) { if (!canSend()) { - session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR)); + session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new Adapter()); throw new IllegalStateException("Protocol violation: cannot send a HEADERS frame before a SYN_REPLY frame"); } if (isLocallyClosed()) { - session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR)); + session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new Adapter()); throw new IllegalStateException("Protocol violation: cannot send a HEADERS frame on a closed stream"); } updateCloseState(headersInfo.isClose(), true); HeadersFrame frame = new HeadersFrame(session.getVersion(), headersInfo.getFlags(), getId(), headersInfo.getHeaders()); - session.control(this, frame, timeout, unit, callback); + session.control(this, frame, headersInfo.getTimeout(), headersInfo.getUnit(), callback); } @Override diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ByteBufferDataInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ByteBufferDataInfo.java index f0e5a6078bf..c82f6c66836 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ByteBufferDataInfo.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ByteBufferDataInfo.java @@ -19,6 +19,7 @@ package org.eclipse.jetty.spdy.api; import java.nio.ByteBuffer; +import java.util.concurrent.TimeUnit; /** *

Specialized {@link DataInfo} for {@link ByteBuffer} content.

@@ -30,12 +31,12 @@ public class ByteBufferDataInfo extends DataInfo public ByteBufferDataInfo(ByteBuffer buffer, boolean close) { - this(buffer, close, false); + this(0, TimeUnit.SECONDS, buffer, close); } - public ByteBufferDataInfo(ByteBuffer buffer, boolean close, boolean compress) + public ByteBufferDataInfo(long timeout, TimeUnit unit, ByteBuffer buffer, boolean close) { - super(close, compress); + super(timeout, unit, close); this.buffer = buffer; this.length = buffer.remaining(); } diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/BytesDataInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/BytesDataInfo.java index c023816ccb2..e5096003596 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/BytesDataInfo.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/BytesDataInfo.java @@ -19,6 +19,7 @@ package org.eclipse.jetty.spdy.api; import java.nio.ByteBuffer; +import java.util.concurrent.TimeUnit; /** *

Specialized {@link DataInfo} for byte array content.

@@ -32,12 +33,17 @@ public class BytesDataInfo extends DataInfo public BytesDataInfo(byte[] bytes, boolean close) { - this(bytes, 0, bytes.length, close); + this(0, TimeUnit.SECONDS, bytes, close); } - public BytesDataInfo(byte[] bytes, int offset, int length, boolean close) + public BytesDataInfo(long timeout, TimeUnit unit, byte[] bytes, boolean close) { - super(close, false); + this(timeout, unit, bytes, 0, bytes.length, close); + } + + public BytesDataInfo(long timeout, TimeUnit unit, byte[] bytes, int offset, int length, boolean close) + { + super(timeout, unit, close); this.bytes = bytes; this.offset = offset; this.length = length; diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/DataInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/DataInfo.java index 2bbd8b0594f..d22a696f05b 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/DataInfo.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/DataInfo.java @@ -20,6 +20,7 @@ package org.eclipse.jetty.spdy.api; import java.nio.ByteBuffer; import java.nio.charset.Charset; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** @@ -41,7 +42,7 @@ import java.util.concurrent.atomic.AtomicInteger; *

Consuming the data bytes can be done only via {@link #consumeInto(ByteBuffer)} or by a combination * of {@link #readInto(ByteBuffer)} and {@link #consume(int)} (possibly at different times).

*/ -public abstract class DataInfo +public abstract class DataInfo extends Info { /** *

Flag that indicates that this {@link DataInfo} is the last frame in the stream.

@@ -50,17 +51,9 @@ public abstract class DataInfo * @see #getFlags() */ public final static byte FLAG_CLOSE = 1; - /** - *

Flag that indicates that this {@link DataInfo}'s data is compressed.

- * - * @see #isCompress() - * @see #getFlags() - */ - public final static byte FLAG_COMPRESS = 2; private final AtomicInteger consumed = new AtomicInteger(); private boolean close; - private boolean compress; /** *

Creates a new {@link DataInfo} with the given close flag and no compression flag.

@@ -73,33 +66,16 @@ public abstract class DataInfo } /** - *

Creates a new {@link DataInfo} with the given close flag and given compression flag.

+ *

Creates a new {@link DataInfo} with the given close flag and no compression flag.

* - * @param close the close flag - * @param compress the compress flag + * @param timeout + * @param unit + * @param close the value of the close flag */ - public DataInfo(boolean close, boolean compress) + protected DataInfo(long timeout, TimeUnit unit, boolean close) { - setClose(close); - setCompress(compress); - } - - /** - * @return the value of the compress flag - * @see #setCompress(boolean) - */ - public boolean isCompress() - { - return compress; - } - - /** - * @param compress the value of the compress flag - * @see #isCompress() - */ - public void setCompress(boolean compress) - { - this.compress = compress; + super(timeout, unit); + this.close = close; } /** @@ -123,13 +99,10 @@ public abstract class DataInfo /** * @return the close and compress flags as integer * @see #FLAG_CLOSE - * @see #FLAG_COMPRESS */ public byte getFlags() { - byte flags = isClose() ? FLAG_CLOSE : 0; - flags |= isCompress() ? FLAG_COMPRESS : 0; - return flags; + return isClose() ? FLAG_CLOSE : 0; } /** @@ -275,6 +248,6 @@ public abstract class DataInfo @Override public String toString() { - return String.format("DATA @%x available=%d consumed=%d close=%b compress=%b", hashCode(), available(), consumed(), isClose(), isCompress()); + return String.format("DATA @%x available=%d consumed=%d close=%b", hashCode(), available(), consumed(), isClose()); } } diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayInfo.java index a1ef223793d..29d18d9030f 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayInfo.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayInfo.java @@ -18,40 +18,21 @@ package org.eclipse.jetty.spdy.api; +import java.util.concurrent.TimeUnit; + /** - *

A container for GOAWAY frames metadata: the last good stream id and - * the session status.

+ * A GoAwayInfo container. Currently adding nothing to it's base class, but serves to keep the api unchanged in + * future versions when we need to pass more info to the methods having a {@link GoAwayInfo} parameter. */ -public class GoAwayInfo +public class GoAwayInfo extends Info { - private final int lastStreamId; - private final SessionStatus sessionStatus; - - /** - *

Creates a new {@link GoAwayInfo} with the given last good stream id and session status

- * - * @param lastStreamId the last good stream id - * @param sessionStatus the session status - */ - public GoAwayInfo(int lastStreamId, SessionStatus sessionStatus) + public GoAwayInfo(long timeout, TimeUnit unit) { - this.lastStreamId = lastStreamId; - this.sessionStatus = sessionStatus; + super(timeout, unit); } - /** - * @return the last good stream id - */ - public int getLastStreamId() + public GoAwayInfo() { - return lastStreamId; - } - - /** - * @return the session status - */ - public SessionStatus getSessionStatus() - { - return sessionStatus; + super(); } } diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayReceivedInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayReceivedInfo.java new file mode 100644 index 00000000000..b4391295af1 --- /dev/null +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayReceivedInfo.java @@ -0,0 +1,57 @@ +// +// ======================================================================== +// Copyright (c) 1995-2012 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. +// ======================================================================== +// + +package org.eclipse.jetty.spdy.api; + +/** + *

A container for GOAWAY frames metadata: the last good stream id and + * the session status.

+ */ +public class GoAwayReceivedInfo +{ + private final int lastStreamId; + private final SessionStatus sessionStatus; + + /** + *

Creates a new {@link GoAwayReceivedInfo} with the given last good stream id and session status

+ * + * @param lastStreamId the last good stream id + * @param sessionStatus the session status + */ + public GoAwayReceivedInfo(int lastStreamId, SessionStatus sessionStatus) + { + this.lastStreamId = lastStreamId; + this.sessionStatus = sessionStatus; + } + + /** + * @return the last good stream id + */ + public int getLastStreamId() + { + return lastStreamId; + } + + /** + * @return the session status + */ + public SessionStatus getSessionStatus() + { + return sessionStatus; + } +} diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/HeadersInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/HeadersInfo.java index 0d4889d7137..0ae231cab46 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/HeadersInfo.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/HeadersInfo.java @@ -18,12 +18,14 @@ package org.eclipse.jetty.spdy.api; +import java.util.concurrent.TimeUnit; + import org.eclipse.jetty.util.Fields; /** *

A container for HEADERS frame metadata and headers.

*/ -public class HeadersInfo +public class HeadersInfo extends Info { /** *

Flag that indicates that this {@link HeadersInfo} is the last frame in the stream.

@@ -45,11 +47,11 @@ public class HeadersInfo private final Fields headers; /** - *

Creates a new {@link HeadersInfo} instance with the given headers, - * the given close flag and no reset compression flag

+ *

Creates a new {@link HeadersInfo} instance with the given headers, the given close flag and no reset + * compression flag

* * @param headers the {@link Fields} - * @param close the value of the close flag + * @param close the value of the close flag */ public HeadersInfo(Fields headers, boolean close) { @@ -57,11 +59,11 @@ public class HeadersInfo } /** - *

Creates a new {@link HeadersInfo} instance with the given headers, - * the given close flag and the given reset compression flag

+ *

Creates a new {@link HeadersInfo} instance with the given headers, the given close flag and the given reset + * compression flag

* - * @param headers the {@link Fields} - * @param close the value of the close flag + * @param headers the {@link Fields} + * @param close the value of the close flag * @param resetCompression the value of the reset compression flag */ public HeadersInfo(Fields headers, boolean close, boolean resetCompression) @@ -71,6 +73,24 @@ public class HeadersInfo this.resetCompression = resetCompression; } + /** + *

Creates a new {@link HeadersInfo} instance with the given headers, the given close flag and the given reset + * compression flag

+ * + * @param timeout the operation's timeout + * @param unit the timeout's unit + * @param headers the {@link Fields} + * @param close the value of the close flag + * @param resetCompression the value of the reset compression flag + */ + public HeadersInfo(long timeout, TimeUnit unit, boolean close, boolean resetCompression, Fields headers) + { + super(timeout, unit); + this.close = close; + this.resetCompression = resetCompression; + this.headers = headers; + } + /** * @return the value of the close flag */ diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Info.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Info.java new file mode 100644 index 00000000000..401c5175511 --- /dev/null +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Info.java @@ -0,0 +1,52 @@ +// +// ======================================================================== +// Copyright (c) 1995-2012 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. +// ======================================================================== +// + +package org.eclipse.jetty.spdy.api; + +import java.util.concurrent.TimeUnit; + +/** + * A base class for all *Info classes providing timeout and unit and api to access them + */ +public class Info +{ + private final long timeout; + private final TimeUnit unit; + + public Info(long timeout, TimeUnit unit) + { + this.timeout = timeout; + this.unit = unit; + } + + public Info() + { + timeout = 0; + unit = TimeUnit.SECONDS; + } + + public long getTimeout() + { + return timeout; + } + + public TimeUnit getUnit() + { + return unit; + } +} diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingInfo.java index 88eed82b44d..090e331897a 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingInfo.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingInfo.java @@ -18,27 +18,21 @@ package org.eclipse.jetty.spdy.api; -/** - *

A container for PING frames data.

- */ -public class PingInfo -{ - private final int pingId; +import java.util.concurrent.TimeUnit; - /** - *

Creates a {@link PingInfo} with the given ping id

- * @param pingId the ping id - */ - public PingInfo(int pingId) +/** + * A PingInfo container. Currently adding nothing to it's base class, but serves to keep the api unchanged in + * future versions when we need to pass more info to the methods having a {@link PingInfo} parameter. + */ +public class PingInfo extends Info +{ + public PingInfo(long timeout, TimeUnit unit) { - this.pingId = pingId; + super(timeout, unit); } - /** - * @return the ping id - */ - public int getPingId() + public PingInfo() { - return pingId; + this(0, TimeUnit.SECONDS); } } diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingResultInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingResultInfo.java new file mode 100644 index 00000000000..1d4db5877c8 --- /dev/null +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingResultInfo.java @@ -0,0 +1,44 @@ +// +// ======================================================================== +// Copyright (c) 1995-2012 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. +// ======================================================================== +// + +package org.eclipse.jetty.spdy.api; + +/** + *

A container for PING frames data.

+ */ +public class PingResultInfo +{ + private final int pingId; + + /** + *

Creates a {@link PingResultInfo} with the given ping id

+ * @param pingId the ping id + */ + public PingResultInfo(int pingId) + { + this.pingId = pingId; + } + + /** + * @return the ping id + */ + public int getPingId() + { + return pingId; + } +} diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ReplyInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ReplyInfo.java index 12109af71a0..deb083a0a1d 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ReplyInfo.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ReplyInfo.java @@ -18,12 +18,14 @@ package org.eclipse.jetty.spdy.api; +import java.util.concurrent.TimeUnit; + import org.eclipse.jetty.util.Fields; /** *

A container for SYN_REPLY frames metadata and headers.

*/ -public class ReplyInfo +public class ReplyInfo extends Info { /** *

Flag that indicates that this {@link ReplyInfo} is the last frame in the stream.

@@ -50,10 +52,24 @@ public class ReplyInfo *

Creates a {@link ReplyInfo} instance with the given headers and the given close flag.

* * @param headers the {@link Fields} - * @param close the value of the close flag + * @param close the value of the close flag */ public ReplyInfo(Fields headers, boolean close) { + this(0, TimeUnit.SECONDS, headers, close); + } + + /** + *

Creates a {@link ReplyInfo} instance with the given headers and the given close flag.

+ * + * @param timeout the timeout + * @param unit the time unit for the timeout + * @param headers the {@link Fields} + * @param close the value of the close flag + */ + public ReplyInfo(long timeout, TimeUnit unit, Fields headers, boolean close) + { + super(timeout, unit); this.headers = headers; this.close = close; } diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/RstInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/RstInfo.java index ff4e96436e5..cfcda1b86f5 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/RstInfo.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/RstInfo.java @@ -18,10 +18,12 @@ package org.eclipse.jetty.spdy.api; +import java.util.concurrent.TimeUnit; + /** *

A container for RST_STREAM frames data: the stream id and the stream status.

*/ -public class RstInfo +public class RstInfo extends Info { private final int streamId; private final StreamStatus streamStatus; @@ -29,13 +31,27 @@ public class RstInfo /** *

Creates a new {@link RstInfo} with the given stream id and stream status

* - * @param streamId the stream id + * @param timeout the operation's timeout + * @param unit the timeout's unit + * @param streamId the stream id * @param streamStatus the stream status */ + public RstInfo(long timeout, TimeUnit unit, int streamId, StreamStatus streamStatus) + { + super(timeout, unit); + this.streamId = streamId; + this.streamStatus = streamStatus; + } + + /** + *

Creates a new {@link RstInfo} with the given stream id and stream status

+ * + * @param streamId + * @param streamStatus + */ public RstInfo(int streamId, StreamStatus streamStatus) { - this.streamId = streamId; - this.streamStatus = streamStatus; + this(0, TimeUnit.SECONDS, streamId, streamStatus); } /** diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Session.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Session.java index 4a5eb88bfd7..3ffcce23b2b 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Session.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Session.java @@ -21,8 +21,8 @@ package org.eclipse.jetty.spdy.api; import java.net.InetSocketAddress; import java.util.EventListener; import java.util.Set; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Promise; @@ -75,115 +75,119 @@ public interface Session *

Callers may use the returned future to wait for the stream to be created, and * use the stream, for example, to send data frames.

* + * * @param synInfo the metadata to send on stream creation * @param listener the listener to invoke when events happen on the stream just created - * @return a future for the stream that will be created - * @see #syn(SynInfo, StreamFrameListener, long, TimeUnit, Promise) + * @return the stream that will be created + * @see #syn(SynInfo, StreamFrameListener, Promise */ - public Future syn(SynInfo synInfo, StreamFrameListener listener); + public Stream syn(SynInfo synInfo, StreamFrameListener listener) throws ExecutionException, InterruptedException, TimeoutException; /** *

Sends asynchronously a SYN_FRAME to create a new {@link Stream SPDY stream}.

*

Callers may pass a non-null completion callback to be notified of when the * stream has been created and use the stream, for example, to send data frames.

* + * * @param synInfo the metadata to send on stream creation * @param listener the listener to invoke when events happen on the stream just created - * @param timeout the operation's timeout - * @param unit the timeout's unit * @param promise the completion callback that gets notified of stream creation * @see #syn(SynInfo, StreamFrameListener) */ - public void syn(SynInfo synInfo, StreamFrameListener listener, long timeout, TimeUnit unit, Promise promise); + public void syn(SynInfo synInfo, StreamFrameListener listener, Promise promise); /** *

Sends asynchronously a RST_STREAM to abort a stream.

*

Callers may use the returned future to wait for the reset to be sent.

* + * * @param rstInfo the metadata to reset the stream - * @return a future to wait for the reset to be sent - * @see #rst(RstInfo, long, TimeUnit, Callback) + * @return the RstInfo belonging to the reset to be sent + * @see #rst(RstInfo, Callback) */ - public Future rst(RstInfo rstInfo); + public void rst(RstInfo rstInfo) throws InterruptedException, ExecutionException, TimeoutException; /** *

Sends asynchronously a RST_STREAM to abort a stream.

*

Callers may pass a non-null completion callback to be notified of when the * reset has been actually sent.

* + * * @param rstInfo the metadata to reset the stream - * @param timeout the operation's timeout - * @param unit the timeout's unit * @param callback the completion callback that gets notified of reset's send * @see #rst(RstInfo) */ - public void rst(RstInfo rstInfo, long timeout, TimeUnit unit, Callback callback); + public void rst(RstInfo rstInfo, Callback callback); /** *

Sends asynchronously a SETTINGS to configure the SPDY connection.

*

Callers may use the returned future to wait for the settings to be sent.

* + * * @param settingsInfo the metadata to send * @return a future to wait for the settings to be sent - * @see #settings(SettingsInfo, long, TimeUnit, Callback) + * @see #settings(SettingsInfo, Callback) */ - public Future settings(SettingsInfo settingsInfo); + public void settings(SettingsInfo settingsInfo) throws ExecutionException, InterruptedException, TimeoutException; /** *

Sends asynchronously a SETTINGS to configure the SPDY connection.

*

Callers may pass a non-null completion callback to be notified of when the * settings has been actually sent.

* + * * @param settingsInfo the metadata to send - * @param timeout the operation's timeout - * @param unit the timeout's unit * @param callback the completion callback that gets notified of settings' send * @see #settings(SettingsInfo) */ - public void settings(SettingsInfo settingsInfo, long timeout, TimeUnit unit, Callback callback); + public void settings(SettingsInfo settingsInfo, Callback callback); /** *

Sends asynchronously a PING, normally to measure round-trip time.

*

Callers may use the returned future to wait for the ping to be sent.

* * @return a future for the metadata sent - * @see #ping(long, TimeUnit, Promise) + * @see #ping(PingInfo, Promise + * @param pingInfo */ - public Future ping(); + public PingResultInfo ping(PingInfo pingInfo) throws ExecutionException, InterruptedException, TimeoutException; /** *

Sends asynchronously a PING, normally to measure round-trip time.

*

Callers may pass a non-null completion callback to be notified of when the * ping has been actually sent.

* - * @param timeout the operation's timeout - * @param unit the timeout's unit + * + * + * @param pingInfo * @param promise the completion callback that gets notified of ping's send - * @see #ping() + * @see #ping(PingInfo) */ - public void ping(long timeout, TimeUnit unit, Promise promise); + public void ping(PingInfo pingInfo, Promise promise); /** *

Closes gracefully this session, sending a GO_AWAY frame and then closing the TCP connection.

*

Callers may use the returned future to wait for the go away to be sent.

* * @return a future to wait for the go away to be sent - * @see #goAway(long, TimeUnit, Callback) + * @see #goAway(GoAwayInfo, Callback) + * @param goAwayInfo */ - public Future goAway(); + public void goAway(GoAwayInfo goAwayInfo) throws ExecutionException, InterruptedException, TimeoutException; /** *

Closes gracefully this session, sending a GO_AWAY frame and then closing the TCP connection.

*

Callers may pass a non-null completion callback to be notified of when the * go away has been actually sent.

* - * @param timeout the operation's timeout - * @param unit the timeout's unit + * + * + * @param goAwayInfo * @param callback the completion callback that gets notified of go away's send - * @see #goAway() + * @see #goAway(GoAwayInfo) */ - public void goAway(long timeout, TimeUnit unit, Callback callback); + public void goAway(GoAwayInfo goAwayInfo, Callback callback); /** * @return a snapshot of the streams currently active in this session diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SessionFrameListener.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SessionFrameListener.java index dc7ab7f8357..439330a5ab7 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SessionFrameListener.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SessionFrameListener.java @@ -98,17 +98,17 @@ public interface SessionFrameListener extends EventListener *

Callback invoked when a ping request has completed its round-trip.

* * @param session the session - * @param pingInfo the metadata received + * @param pingResultInfo the metadata received */ - public void onPing(Session session, PingInfo pingInfo); + public void onPing(Session session, PingResultInfo pingResultInfo); /** *

Callback invoked when the other peer signals that it is closing the connection.

* * @param session the session - * @param goAwayInfo the metadata sent + * @param goAwayReceivedInfo the metadata sent */ - public void onGoAway(Session session, GoAwayInfo goAwayInfo); + public void onGoAway(Session session, GoAwayReceivedInfo goAwayReceivedInfo); /** *

Callback invoked when an exception is thrown during the processing of an event on a @@ -143,12 +143,12 @@ public interface SessionFrameListener extends EventListener } @Override - public void onPing(Session session, PingInfo pingInfo) + public void onPing(Session session, PingResultInfo pingResultInfo) { } @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayReceivedInfo) { } diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SettingsInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SettingsInfo.java index dc3b7ec577b..8e0eeb2aa43 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SettingsInfo.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SettingsInfo.java @@ -18,7 +18,9 @@ package org.eclipse.jetty.spdy.api; -public class SettingsInfo +import java.util.concurrent.TimeUnit; + +public class SettingsInfo extends Info { public static final byte CLEAR_PERSISTED = 1; @@ -27,13 +29,19 @@ public class SettingsInfo public SettingsInfo(Settings settings) { - this(settings, false); + this(0, TimeUnit.SECONDS, settings, false); + } + + public SettingsInfo(long timeout, TimeUnit unit, Settings settings, boolean clearPersisted) + { + super(timeout, unit); + this.settings = settings; + this.clearPersisted = clearPersisted; } public SettingsInfo(Settings settings, boolean clearPersisted) { - this.settings = settings; - this.clearPersisted = clearPersisted; + this(0, TimeUnit.SECONDS, settings, clearPersisted); } public boolean isClearPersisted() diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Stream.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Stream.java index 472aa5550a2..328fa6c217f 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Stream.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Stream.java @@ -20,8 +20,8 @@ package org.eclipse.jetty.spdy.api; import java.nio.channels.WritePendingException; import java.util.Set; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Promise; @@ -50,7 +50,7 @@ import org.eclipse.jetty.util.Promise; * stream.data(StringDataInfo("chunk1", false), 5, TimeUnit.SECONDS, new Handler<Void>() { ... }); * stream.data(StringDataInfo("chunk2", true), 1, TimeUnit.SECONDS, new Handler<Void>() { ... }); * - *

where the second call to {@link #data(DataInfo, long, TimeUnit, Callback)} has a timeout smaller + *

where the second call to {@link #data(DataInfo, Callback)} has a timeout smaller * than the previous call.

*

The behavior of such style of invocations is unspecified (it may even throw an exception - similar * to {@link WritePendingException}).

@@ -95,11 +95,12 @@ public interface Stream *

Initiate a unidirectional spdy pushstream associated to this stream asynchronously

*

Callers may use the returned future to get the pushstream once it got created

* + * * @param synInfo the metadata to send on stream creation * @return a future containing the stream once it got established - * @see #syn(SynInfo, long, TimeUnit, Promise) + * @see #syn(SynInfo, Promise) */ - public Future syn(SynInfo synInfo); + public Stream syn(SynInfo synInfo) throws InterruptedException, ExecutionException, TimeoutException; /** *

Initiate a unidirectional spdy pushstream associated to this stream asynchronously

@@ -107,23 +108,22 @@ public interface Stream * pushstream has been established.

* * @param synInfo the metadata to send on stream creation - * @param timeout the operation's timeout - * @param unit the timeout's unit * @param callback the completion callback that gets notified once the pushstream is established * @see #syn(SynInfo) */ - public void syn(SynInfo synInfo, long timeout, TimeUnit unit, Promise callback); + public void syn(SynInfo synInfo, Promise callback); /** *

Sends asynchronously a SYN_REPLY frame in response to a SYN_STREAM frame.

*

Callers may use the returned future to wait for the reply to be actually sent.

* + * * @param replyInfo the metadata to send * @return a future to wait for the reply to be sent - * @see #reply(ReplyInfo, long, TimeUnit, Callback) + * @see #reply(ReplyInfo, Callback) * @see SessionFrameListener#onSyn(Stream, SynInfo) */ - public Future reply(ReplyInfo replyInfo); + public void reply(ReplyInfo replyInfo) throws InterruptedException, ExecutionException, TimeoutException; /** *

Sends asynchronously a SYN_REPLY frame in response to a SYN_STREAM frame.

@@ -131,24 +131,23 @@ public interface Stream * reply has been actually sent.

* * @param replyInfo the metadata to send - * @param timeout the operation's timeout - * @param unit the timeout's unit * @param callback the completion callback that gets notified of reply sent * @see #reply(ReplyInfo) */ - public void reply(ReplyInfo replyInfo, long timeout, TimeUnit unit, Callback callback); + public void reply(ReplyInfo replyInfo, Callback callback); /** *

Sends asynchronously a DATA frame on this stream.

*

DATA frames should always be sent after a SYN_REPLY frame.

*

Callers may use the returned future to wait for the data to be actually sent.

* + * * @param dataInfo the metadata to send * @return a future to wait for the data to be sent - * @see #data(DataInfo, long, TimeUnit, Callback) + * @see #data(DataInfo, Callback) * @see #reply(ReplyInfo) */ - public Future data(DataInfo dataInfo); + public void data(DataInfo dataInfo) throws InterruptedException, ExecutionException, TimeoutException; /** *

Sends asynchronously a DATA frame on this stream.

@@ -157,24 +156,23 @@ public interface Stream * data has been actually sent.

* * @param dataInfo the metadata to send - * @param timeout the operation's timeout - * @param unit the timeout's unit * @param callback the completion callback that gets notified of data sent * @see #data(DataInfo) */ - public void data(DataInfo dataInfo, long timeout, TimeUnit unit, Callback callback); + public void data(DataInfo dataInfo, Callback callback); /** *

Sends asynchronously a HEADER frame on this stream.

*

HEADERS frames should always be sent after a SYN_REPLY frame.

*

Callers may use the returned future to wait for the headers to be actually sent.

* + * * @param headersInfo the metadata to send * @return a future to wait for the headers to be sent - * @see #headers(HeadersInfo, long, TimeUnit, Callback + * @see #headers(HeadersInfo, Callback * @see #reply(ReplyInfo) */ - public Future headers(HeadersInfo headersInfo); + public void headers(HeadersInfo headersInfo) throws InterruptedException, ExecutionException, TimeoutException; /** *

Sends asynchronously a HEADER frame on this stream.

@@ -183,12 +181,10 @@ public interface Stream * headers have been actually sent.

* * @param headersInfo the metadata to send - * @param timeout the operation's timeout - * @param unit the timeout's unit * @param callback the completion callback that gets notified of headers sent * @see #headers(HeadersInfo) */ - public void headers(HeadersInfo headersInfo, long timeout, TimeUnit unit, Callback callback); + public void headers(HeadersInfo headersInfo, Callback callback); /** * @return whether this stream is unidirectional or not diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StringDataInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StringDataInfo.java index 6f0825c0a6d..d78bcd22798 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StringDataInfo.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StringDataInfo.java @@ -19,6 +19,7 @@ package org.eclipse.jetty.spdy.api; import java.nio.charset.Charset; +import java.util.concurrent.TimeUnit; /** *

Specialized {@link DataInfo} for {@link String} content.

@@ -29,4 +30,9 @@ public class StringDataInfo extends BytesDataInfo { super(string.getBytes(Charset.forName("UTF-8")), close); } + + public StringDataInfo(long timeout, TimeUnit unit, String string, boolean close) + { + super(timeout, unit, string.getBytes(Charset.forName("UTF-8")), close); + } } diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SynInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SynInfo.java index 20dafbaecdc..032155e6f13 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SynInfo.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SynInfo.java @@ -18,12 +18,14 @@ package org.eclipse.jetty.spdy.api; +import java.util.concurrent.TimeUnit; + import org.eclipse.jetty.util.Fields; /** *

A container for SYN_STREAM frames metadata and data.

*/ -public class SynInfo +public class SynInfo extends Info { /** *

Flag that indicates that this {@link DataInfo} is the last frame in the stream.

@@ -37,17 +39,6 @@ public class SynInfo private final byte priority; private final Fields headers; - /** - *

Creates a new {@link SynInfo} instance with empty headers and the given close flag, - * not unidirectional, without associated stream, and with default priority.

- * - * @param close the value of the close flag - */ - public SynInfo(boolean close) - { - this(new Fields(), close); - } - /** *

Creates a {@link ReplyInfo} instance with the given headers and the given close flag, * not unidirectional, without associated stream, and with default priority.

@@ -57,23 +48,40 @@ public class SynInfo */ public SynInfo(Fields headers, boolean close) { - this(headers, close, (byte)0); + this(0, TimeUnit.SECONDS, headers, close, (byte)0); + // either builder or setters for timeout } /** *

* Creates a {@link ReplyInfo} instance with the given headers, the given close flag and with the given priority. *

- * * @param headers * the {@link Fields} * @param close * the value of the close flag * @param priority - * the priority */ public SynInfo(Fields headers, boolean close, byte priority) { + this(0, TimeUnit.SECONDS, headers, close, priority); + } + + /** + *

+ * Creates a {@link ReplyInfo} instance with the given headers, the given close flag and with the given priority. + *

+ * @param timeout the timeout value + * @param unit the TimeUnit of the timeout + * @param headers + * the {@link Fields} + * @param close + * the value of the close flag + * @param priority + */ + public SynInfo(long timeout, TimeUnit unit, Fields headers, boolean close, byte priority) + { + super(timeout, unit); this.close = close; this.priority = priority; this.headers = headers; diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/DataFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/DataFrame.java index b0879ec59ad..abcfd446fe3 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/DataFrame.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/DataFrame.java @@ -55,14 +55,9 @@ public class DataFrame return (flags & DataInfo.FLAG_CLOSE) == DataInfo.FLAG_CLOSE; } - public boolean isCompress() - { - return (flags & DataInfo.FLAG_COMPRESS) == DataInfo.FLAG_COMPRESS; - } - @Override public String toString() { - return String.format("DATA frame stream=%d length=%d close=%b compress=%b", getStreamId(), getLength(), isClose(), isCompress()); + return String.format("DATA frame stream=%d length=%d close=%b", getStreamId(), getLength(), isClose()); } } diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/AsyncTimeoutTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/AsyncTimeoutTest.java index 110930c743a..ef6ec1a352b 100644 --- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/AsyncTimeoutTest.java +++ b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/AsyncTimeoutTest.java @@ -36,6 +36,7 @@ import org.eclipse.jetty.spdy.generator.Generator; import org.eclipse.jetty.toolchain.test.AdvancedRunner; import org.eclipse.jetty.toolchain.test.annotation.Slow; import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.Fields; import org.eclipse.jetty.util.Promise; import org.eclipse.jetty.util.thread.Scheduler; import org.eclipse.jetty.util.thread.TimerScheduler; @@ -77,7 +78,7 @@ public class AsyncTimeoutTest }; final CountDownLatch failedLatch = new CountDownLatch(1); - session.syn(new SynInfo(true), null, timeout, unit, new Promise.Adapter() + session.syn(new SynInfo(timeout, unit, new Fields(), true, (byte)0), null, new Promise.Adapter() { @Override public void failed(Throwable x) @@ -121,9 +122,9 @@ public class AsyncTimeoutTest } }; - Stream stream = session.syn(new SynInfo(false), null).get(5, TimeUnit.SECONDS); + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null); final CountDownLatch failedLatch = new CountDownLatch(1); - stream.data(new StringDataInfo("data", true), timeout, unit, new Callback.Adapter() + stream.data(new StringDataInfo(timeout, unit, "data", true), new Callback.Adapter() { @Override public void failed(Throwable x) diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardSessionTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardSessionTest.java index b1586b0ff86..383506532c6 100644 --- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardSessionTest.java +++ b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardSessionTest.java @@ -48,6 +48,7 @@ import org.eclipse.jetty.spdy.frames.SynStreamFrame; import org.eclipse.jetty.spdy.generator.Generator; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Fields; +import org.eclipse.jetty.util.FuturePromise; import org.eclipse.jetty.util.Promise; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; @@ -76,6 +77,7 @@ import static org.mockito.Mockito.verify; public class StandardSessionTest { private static final Logger LOG = Log.getLogger(StandardSessionTest.class); + private static final short VERSION = SPDY.V2; @Mock private Controller controller; @@ -92,7 +94,7 @@ public class StandardSessionTest threadPool = Executors.newCachedThreadPool(); scheduler = new TimerScheduler(); scheduler.start(); - session = new StandardSession(SPDY.V2, bufferPool, threadPool, scheduler, controller, null, null, 1, null, + session = new StandardSession(VERSION, bufferPool, threadPool, scheduler, controller, null, null, 1, null, generator, new FlowControlStrategy.None()); headers = new Fields(); } @@ -144,7 +146,7 @@ public class StandardSessionTest IStream stream = createStream(); assertThatStreamIsInSession(stream); stream.updateCloseState(true, true); - session.onControlFrame(new SynReplyFrame(SPDY.V2, SynInfo.FLAG_CLOSE, stream.getId(), null)); + session.onControlFrame(new SynReplyFrame(VERSION, SynInfo.FLAG_CLOSE, stream.getId(), null)); assertThatStreamIsClosed(stream); assertThatStreamIsNotInSession(stream); } @@ -202,7 +204,7 @@ public class StandardSessionTest assertThatPushStreamIsHalfClosed(pushStream); assertThatPushStreamIsNotClosed(pushStream); - session.onControlFrame(new SynReplyFrame(SPDY.V2, SynInfo.FLAG_CLOSE, stream.getId(), null)); + session.onControlFrame(new SynReplyFrame(VERSION, SynInfo.FLAG_CLOSE, stream.getId(), null)); assertThatStreamIsClosed(stream); assertThatPushStreamIsNotClosed(pushStream); } @@ -223,8 +225,8 @@ public class StandardSessionTest private void createPushStreamAndMakeSureItFails(IStream stream) throws InterruptedException { final CountDownLatch failedLatch = new CountDownLatch(1); - SynInfo synInfo = new SynInfo(headers, false, stream.getPriority()); - stream.syn(synInfo, 5, TimeUnit.SECONDS, new Promise.Adapter() + SynInfo synInfo = new SynInfo(5, TimeUnit.SECONDS, headers, false, stream.getPriority()); + stream.syn(synInfo, new Promise.Adapter() { @Override public void failed(Throwable x) @@ -257,7 +259,7 @@ public class StandardSessionTest setControllerWriteExpectation(false); IStream stream = createStream(); - IStream pushStream = (IStream)stream.syn(new SynInfo(false)).get(); + IStream pushStream = (IStream)stream.syn(new SynInfo(new Fields(), false)); assertThatPushStreamIsInSession(pushStream); session.rst(new RstInfo(pushStream.getId(), StreamStatus.INVALID_STREAM)); assertThatPushStreamIsNotInSession(pushStream); @@ -271,8 +273,8 @@ public class StandardSessionTest setControllerWriteExpectation(false); IStream stream = createStream(); - SynInfo synInfo = new SynInfo(headers, true, stream.getPriority()); - IStream pushStream = (IStream)stream.syn(synInfo).get(5, TimeUnit.SECONDS); + SynInfo synInfo = new SynInfo(5, TimeUnit.SECONDS, headers, true, stream.getPriority()); + IStream pushStream = (IStream)stream.syn(synInfo); assertThatPushStreamIsHalfClosed(pushStream); assertThatPushStreamIsClosed(pushStream); assertThatStreamIsNotAssociatedWithPushStream(stream, pushStream); @@ -286,8 +288,8 @@ public class StandardSessionTest setControllerWriteExpectation(false); IStream stream = createStream(); - SynInfo synInfo = new SynInfo(headers, false, stream.getPriority()); - IStream pushStream = (IStream)stream.syn(synInfo).get(5, TimeUnit.SECONDS); + SynInfo synInfo = new SynInfo(5, TimeUnit.SECONDS, headers, false, stream.getPriority()); + IStream pushStream = (IStream)stream.syn(synInfo); assertThatStreamIsAssociatedWithPushStream(stream, pushStream); assertThatPushStreamIsInSession(pushStream); pushStream.headers(new HeadersInfo(headers, true)); @@ -306,6 +308,7 @@ public class StandardSessionTest final CountDownLatch closedListenerCalledLatch = new CountDownLatch(1); session.addListener(new TestStreamListener(createdListenerCalledLatch, closedListenerCalledLatch)); IStream stream = createStream(); + session.onControlFrame(new SynReplyFrame(VERSION, (byte)0, stream.getId(), new Fields())); session.onDataFrame(new DataFrame(stream.getId(), SynInfo.FLAG_CLOSE, 128), ByteBuffer.allocate(128)); stream.data(new StringDataInfo("close", true)); assertThat("onStreamCreated listener has been called", createdListenerCalledLatch.await(5, TimeUnit.SECONDS), is(true)); @@ -383,11 +386,11 @@ public class StandardSessionTest @Test @Ignore("In V3 we need to rst the stream if we receive data on a remotely half closed stream.") - public void receiveDataOnRemotelyHalfClosedStreamResetsStreamInV3() throws InterruptedException, ExecutionException + public void receiveDataOnRemotelyHalfClosedStreamResetsStreamInV3() throws InterruptedException, ExecutionException, TimeoutException { setControllerWriteExpectation(false); - IStream stream = (IStream)session.syn(new SynInfo(false), new StreamFrameListener.Adapter()).get(); + IStream stream = (IStream)session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter()); stream.updateCloseState(true, false); assertThat("stream is half closed from remote side", stream.isHalfClosed(), is(true)); stream.process(new ByteBufferDataInfo(ByteBuffer.allocate(256), true)); @@ -399,16 +402,17 @@ public class StandardSessionTest setControllerWriteExpectation(false); final CountDownLatch onDataCalledLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(false), new StreamFrameListener.Adapter() - { - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - onDataCalledLatch.countDown(); - super.onData(stream, dataInfo); - } - }).get(5, TimeUnit.SECONDS); - session.onControlFrame(new SynReplyFrame(SPDY.V2, SynInfo.FLAG_CLOSE, stream.getId(), headers)); + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), + new StreamFrameListener.Adapter() + { + @Override + public void onData(Stream stream, DataInfo dataInfo) + { + onDataCalledLatch.countDown(); + super.onData(stream, dataInfo); + } + }); + session.onControlFrame(new SynReplyFrame(VERSION, SynInfo.FLAG_CLOSE, stream.getId(), headers)); session.onDataFrame(new DataFrame(stream.getId(), (byte)0, 0), ByteBuffer.allocate(128)); assertThat("onData is never called", onDataCalledLatch.await(1, TimeUnit.SECONDS), not(true)); } @@ -420,7 +424,7 @@ public class StandardSessionTest setControllerWriteExpectation(true); final CountDownLatch failedCalledLatch = new CountDownLatch(2); - SynStreamFrame synStreamFrame = new SynStreamFrame(SPDY.V2, SynInfo.FLAG_CLOSE, 1, 0, (byte)0, (short)0, null); + SynStreamFrame synStreamFrame = new SynStreamFrame(VERSION, SynInfo.FLAG_CLOSE, 1, 0, (byte)0, (short)0, null); IStream stream = new StandardStream(synStreamFrame.getStreamId(), synStreamFrame.getPriority(), session, null, null); stream.updateWindowSize(8192); Callback.Adapter callback = new Callback.Adapter() @@ -433,9 +437,9 @@ public class StandardSessionTest }; // first data frame should fail on controller.write() - stream.data(new StringDataInfo("data", false), 5, TimeUnit.SECONDS, callback); + stream.data(new StringDataInfo(5, TimeUnit.SECONDS, "data", false), callback); // second data frame should fail without controller.write() as the connection is expected to be broken after first controller.write() call failed. - stream.data(new StringDataInfo("data", false), 5, TimeUnit.SECONDS, callback); + stream.data(new StringDataInfo(5, TimeUnit.SECONDS, "data", false), callback); verify(controller, times(1)).write(any(ByteBuffer.class), any(Callback.class)); assertThat("Callback.failed has been called twice", failedCalledLatch.await(5, TimeUnit.SECONDS), is(true)); @@ -449,7 +453,7 @@ public class StandardSessionTest // This is necessary to keep the compression context of Headers valid IStream stream = createStream(); session.rst(new RstInfo(stream.getId(), StreamStatus.INVALID_STREAM)); - stream.headers(new HeadersInfo(headers,true)); + stream.headers(new HeadersInfo(headers, true)); verify(controller, times(3)).write(any(ByteBuffer.class), any(Callback.class)); @@ -471,7 +475,7 @@ public class StandardSessionTest private void testHeaderFramesAreSentInOrder(final byte priority0, final byte priority1, final byte priority2) throws InterruptedException, ExecutionException { - final StandardSession testLocalSession = new StandardSession(SPDY.V2, bufferPool, threadPool, scheduler, + final StandardSession testLocalSession = new StandardSession(VERSION, bufferPool, threadPool, scheduler, new ControllerMock(), null, null, 1, null, generator, new FlowControlStrategy.None()); HashSet tasks = new HashSet<>(); @@ -492,7 +496,7 @@ public class StandardSessionTest private void synStream(byte priority) { SynInfo synInfo = new SynInfo(headers, false, priority); - testLocalSession.syn(synInfo, new StreamFrameListener.Adapter()); + testLocalSession.syn(synInfo, new StreamFrameListener.Adapter(), new FuturePromise()); } })); } @@ -533,14 +537,14 @@ public class StandardSessionTest private IStream createStream() throws InterruptedException, ExecutionException, TimeoutException { - SynInfo synInfo = new SynInfo(headers, false, (byte)0); - return (IStream)session.syn(synInfo, new StreamFrameListener.Adapter()).get(5, TimeUnit.SECONDS); + SynInfo synInfo = new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0); + return (IStream)session.syn(synInfo, new StreamFrameListener.Adapter()); } private IStream createPushStream(Stream stream) throws InterruptedException, ExecutionException, TimeoutException { - SynInfo synInfo = new SynInfo(headers, false, stream.getPriority()); - return (IStream)stream.syn(synInfo).get(5, TimeUnit.SECONDS); + SynInfo synInfo = new SynInfo(5, TimeUnit.SECONDS, headers, false, stream.getPriority()); + return (IStream)stream.syn(synInfo); } private void assertThatStreamIsClosed(IStream stream) diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardStreamTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardStreamTest.java index 92d47d3e9ef..e4ba913c145 100644 --- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardStreamTest.java +++ b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardStreamTest.java @@ -33,6 +33,7 @@ import org.eclipse.jetty.spdy.api.StringDataInfo; import org.eclipse.jetty.spdy.api.SynInfo; import org.eclipse.jetty.spdy.frames.SynStreamFrame; import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.Fields; import org.eclipse.jetty.util.Promise; import org.junit.Test; import org.junit.runner.RunWith; @@ -45,7 +46,6 @@ import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -70,10 +70,10 @@ public class StandardStreamTest Set streams = new HashSet<>(); streams.add(stream); when(synStreamFrame.isClose()).thenReturn(false); - SynInfo synInfo = new SynInfo(false); + SynInfo synInfo = new SynInfo(new Fields(), false); when(session.getStreams()).thenReturn(streams); - stream.syn(synInfo); - verify(session).syn(argThat(new PushSynInfoMatcher(stream.getId(), synInfo)), any(StreamFrameListener.class), anyLong(), any(TimeUnit.class), any(Promise.class)); + stream.syn(synInfo, new Promise.Adapter()); + verify(session).syn(argThat(new PushSynInfoMatcher(stream.getId(), synInfo)), any(StreamFrameListener.class), any(Promise.class)); } private class PushSynInfoMatcher extends ArgumentMatcher @@ -91,9 +91,7 @@ public class StandardStreamTest public boolean matches(Object argument) { PushSynInfo pushSynInfo = (PushSynInfo)argument; - if (pushSynInfo.getAssociatedStreamId() != associatedStreamId) - return false; - return pushSynInfo.isClose() == synInfo.isClose(); + return pushSynInfo.getAssociatedStreamId() == associatedStreamId && pushSynInfo.isClose() == synInfo.isClose(); } } @@ -105,7 +103,7 @@ public class StandardStreamTest stream.updateCloseState(true, false); assertThat("stream expected to be closed", stream.isClosed(), is(true)); final CountDownLatch failedLatch = new CountDownLatch(1); - stream.syn(new SynInfo(false), 1, TimeUnit.SECONDS, new Promise.Adapter() + stream.syn(new SynInfo(1, TimeUnit.SECONDS, new Fields(), false, (byte)0), new Promise.Adapter() { @Override public void failed(Throwable x) diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ClientUsageTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ClientUsageTest.java index 93f96271cca..c347d3a2340 100644 --- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ClientUsageTest.java +++ b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ClientUsageTest.java @@ -19,9 +19,12 @@ package org.eclipse.jetty.spdy.api; import java.nio.charset.Charset; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import org.eclipse.jetty.spdy.StandardSession; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Fields; import org.eclipse.jetty.util.Promise; import org.junit.Ignore; @@ -35,7 +38,7 @@ public class ClientUsageTest { Session session = new StandardSession(SPDY.V2, null, null, null, null, null, null, 1, null, null, null); - session.syn(new SynInfo(true), new StreamFrameListener.Adapter() + session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -44,7 +47,14 @@ public class ClientUsageTest replyInfo.getHeaders().get("host"); // Then issue another similar request - stream.getSession().syn(new SynInfo(true), this); + try + { + stream.getSession().syn(new SynInfo(new Fields(), true), this); + } + catch (ExecutionException | InterruptedException | TimeoutException e) + { + throw new IllegalStateException(e); + } } }); } @@ -54,18 +64,26 @@ public class ClientUsageTest { Session session = new StandardSession(SPDY.V2, null, null, null, null, null, null, 1, null, null, null); - Stream stream = session.syn(new SynInfo(false), new StreamFrameListener.Adapter() - { - @Override + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), + new StreamFrameListener.Adapter() + { + @Override public void onReply(Stream stream, ReplyInfo replyInfo) { // Do something with the response replyInfo.getHeaders().get("host"); // Then issue another similar request - stream.getSession().syn(new SynInfo(true), this); + try + { + stream.getSession().syn(new SynInfo(new Fields(), true), this); + } + catch (ExecutionException | InterruptedException | TimeoutException e) + { + throw new IllegalStateException(e); + } } - }).get(5, TimeUnit.SECONDS); + }); // Send-and-forget the data stream.data(new StringDataInfo("data", true)); } @@ -76,8 +94,8 @@ public class ClientUsageTest Session session = new StandardSession(SPDY.V2, null, null, null, null, null, null, 1, null, null, null); final String context = "context"; - session.syn(new SynInfo(false), new StreamFrameListener.Adapter() - { + session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter() + { @Override public void onReply(Stream stream, ReplyInfo replyInfo) { @@ -85,11 +103,18 @@ public class ClientUsageTest replyInfo.getHeaders().get("host"); // Then issue another similar request - stream.getSession().syn(new SynInfo(true), this); + try + { + stream.getSession().syn(new SynInfo(new Fields(), true), this); + } + catch (ExecutionException | InterruptedException | TimeoutException e) + { + throw new IllegalStateException(e); + } } - }, 0, TimeUnit.MILLISECONDS, new Promise.Adapter() - { - @Override + }, new Promise.Adapter() + { + @Override public void succeeded(Stream stream) { // Differently from JDK 7 AIO, there is no need to @@ -100,7 +125,7 @@ public class ClientUsageTest // The style below is fire-and-forget, since // we do not pass the handler nor we call get() // to wait for the data to be sent - stream.data(new StringDataInfo(context, true)); + stream.data(new StringDataInfo(context, true), new Callback.Adapter()); } }); } @@ -110,8 +135,8 @@ public class ClientUsageTest { Session session = new StandardSession(SPDY.V2, null, null, null, null, null, null, 1, null, null, null); - session.syn(new SynInfo(false), new StreamFrameListener.Adapter() - { + session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter() + { // The good of passing the listener to syn() is that applications can safely // accumulate info from the reply headers to be used in the data callback, // e.g. content-type, charset, etc. @@ -127,7 +152,14 @@ public class ClientUsageTest stream.setAttribute("builder", new StringBuilder()); // May issue another similar request while waiting for data - stream.getSession().syn(new SynInfo(true), this); + try + { + stream.getSession().syn(new SynInfo(new Fields(), true), this); + } + catch (ExecutionException | InterruptedException | TimeoutException e) + { + throw new IllegalStateException(e); + } } @Override @@ -138,18 +170,18 @@ public class ClientUsageTest if (dataInfo.isClose()) { int receivedLength = builder.toString().getBytes(Charset.forName("UTF-8")).length; - assert receivedLength == (Integer)stream.getAttribute("content-length"); + assert receivedLength == stream.getAttribute("content-length"); } } - }, 0, TimeUnit.MILLISECONDS, new Promise.Adapter() - { - @Override + }, new Promise.Adapter() + { + @Override public void succeeded(Stream stream) { - stream.data(new BytesDataInfo("wee".getBytes(Charset.forName("UTF-8")), false)); - stream.data(new StringDataInfo("foo", false)); - stream.data(new ByteBufferDataInfo(Charset.forName("UTF-8").encode("bar"), true)); + stream.data(new BytesDataInfo("wee".getBytes(Charset.forName("UTF-8")), false), new Callback.Adapter()); + stream.data(new StringDataInfo("foo", false), new Callback.Adapter()); + stream.data(new ByteBufferDataInfo(Charset.forName("UTF-8").encode("bar"), true), new Callback.Adapter()); } }); } diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ServerUsageTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ServerUsageTest.java index 97bce63431b..7a5f7dbb194 100644 --- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ServerUsageTest.java +++ b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ServerUsageTest.java @@ -18,8 +18,6 @@ package org.eclipse.jetty.spdy.api; -import java.util.concurrent.TimeUnit; - import junit.framework.Assert; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; @@ -48,11 +46,11 @@ public class ServerUsageTest Fields replyHeaders = new Fields(); replyHeaders.put(synHeaders.get("host")); // Sends a reply - stream.reply(new ReplyInfo(replyHeaders, false)); + stream.reply(new ReplyInfo(replyHeaders, false), new Callback.Adapter()); // Sends data StringDataInfo dataInfo = new StringDataInfo("foo", false); - stream.data(dataInfo); + stream.data(dataInfo, new Callback.Adapter()); // Stream is now closed return null; } @@ -77,7 +75,7 @@ public class ServerUsageTest // // However, the API may allow to initiate the stream - session.syn(new SynInfo(false), null, 0, TimeUnit.MILLISECONDS, new Promise.Adapter() + session.syn(new SynInfo(new Fields(), false), null, new Promise.Adapter() { @Override public void succeeded(Stream stream) @@ -87,7 +85,7 @@ public class ServerUsageTest // the client sends a rst frame. // We have to atomically set some flag on the stream to signal it's closed // and any operation on it will throw - stream.headers(new HeadersInfo(new Fields(), true)); + stream.headers(new HeadersInfo(new Fields(), true), new Callback.Adapter()); } }); } @@ -104,16 +102,16 @@ public class ServerUsageTest public StreamFrameListener onSyn(Stream stream, SynInfo streamInfo) { // Need to send the reply first - stream.reply(new ReplyInfo(false)); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); Session session = stream.getSession(); // Since it's unidirectional, no need to pass the listener - session.syn(new SynInfo(new Fields(), false, (byte)0), null, 0, TimeUnit.MILLISECONDS, new Promise.Adapter() + session.syn(new SynInfo(new Fields(), false, (byte)0), null, new Promise.Adapter() { @Override public void succeeded(Stream pushStream) { - pushStream.data(new StringDataInfo("foo", false)); + pushStream.data(new StringDataInfo("foo", false), new Callback.Adapter()); } }); return null; diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpChannelOverSPDY.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpChannelOverSPDY.java index 6c165998d61..54dcc664387 100644 --- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpChannelOverSPDY.java +++ b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpChannelOverSPDY.java @@ -134,7 +134,7 @@ public class HttpChannelOverSPDY extends HttpChannel // will be consumed. When the copy is consumed, we consume also the // original, so the implementation can send a window update. ByteBuffer copyByteBuffer = dataInfo.asByteBuffer(false); - ByteBufferDataInfo copyDataInfo = new ByteBufferDataInfo(copyByteBuffer, dataInfo.isClose(), dataInfo.isCompress()) + ByteBufferDataInfo copyDataInfo = new ByteBufferDataInfo(copyByteBuffer, dataInfo.isClose()) { @Override public void consume(int delta) diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java index 7895b0f1fdc..ea1286b4916 100644 --- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java +++ b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java @@ -68,7 +68,7 @@ public class HttpTransportOverSPDY implements HttpTransport this.connector = connector; this.configuration = configuration; this.endPoint = endPoint; - this.pushStrategy = pushStrategy==null?new PushStrategy.None():pushStrategy; + this.pushStrategy = pushStrategy == null ? new PushStrategy.None() : pushStrategy; this.stream = stream; this.requestHeaders = requestHeaders; } @@ -77,7 +77,7 @@ public class HttpTransportOverSPDY implements HttpTransport public void send(HttpGenerator.ResponseInfo info, ByteBuffer content, boolean lastContent, Callback callback) { if (LOG.isDebugEnabled()) - LOG.debug("send {} {} {} {} last={}",this,stream,info,BufferUtil.toDetailString(content),lastContent); + LOG.debug("send {} {} {} {} last={}", this, stream, info, BufferUtil.toDetailString(content), lastContent); if (stream.isClosed() || stream.isReset()) { @@ -98,9 +98,10 @@ public class HttpTransportOverSPDY implements HttpTransport boolean hasContent = BufferUtil.hasContent(content); - if (info!=null) + if (info != null) { - if(!committed.compareAndSet(false, true)){ + if (!committed.compareAndSet(false, true)) + { StreamException exception = new StreamException(stream.getId(), StreamStatus.PROTOCOL_ERROR, "Stream already committed!"); callback.failed(exception); @@ -138,7 +139,7 @@ public class HttpTransportOverSPDY implements HttpTransport } boolean close = !hasContent && lastContent; - ReplyInfo reply = new ReplyInfo(headers,close); + ReplyInfo reply = new ReplyInfo(headers, close); reply(stream, reply); } @@ -146,23 +147,25 @@ public class HttpTransportOverSPDY implements HttpTransport if (hasContent) { // Is the stream still open? - if (stream.isClosed()|| stream.isReset()) + if (stream.isClosed() || stream.isReset()) // tell the callback about the EOF - callback.failed(new EofException("stream closed")); - else + callback.failed(new EofException("stream closed")); + else // send the data and let it call the callback - stream.data(new ByteBufferDataInfo(content, lastContent),endPoint.getIdleTimeout(),TimeUnit.MILLISECONDS,callback); + stream.data(new ByteBufferDataInfo(endPoint.getIdleTimeout(), TimeUnit.MILLISECONDS, content, lastContent + ), callback); } // else do we need to close else if (lastContent) { // Are we closed ? - if (stream.isClosed()|| stream.isReset()) + if (stream.isClosed() || stream.isReset()) // already closed by reply, so just tell callback we are complete - callback.succeeded(); + callback.succeeded(); else // send empty data to close and let the send call the callback - stream.data(new ByteBufferDataInfo(BufferUtil.EMPTY_BUFFER, lastContent),endPoint.getIdleTimeout(),TimeUnit.MILLISECONDS,callback); + stream.data(new ByteBufferDataInfo(endPoint.getIdleTimeout(), TimeUnit.MILLISECONDS, + BufferUtil.EMPTY_BUFFER, lastContent), callback); } else // No data and no close so tell callback we are completed @@ -173,7 +176,7 @@ public class HttpTransportOverSPDY implements HttpTransport @Override public void send(HttpGenerator.ResponseInfo info, ByteBuffer content, boolean lastContent) throws EofException { - send(info,content,lastContent,streamBlocker); + send(info, content, lastContent, streamBlocker); try { streamBlocker.block(); @@ -194,7 +197,7 @@ public class HttpTransportOverSPDY implements HttpTransport private void reply(Stream stream, ReplyInfo replyInfo) { if (!stream.isUnidirectional()) - stream.reply(replyInfo); + stream.reply(replyInfo, new Callback.Adapter()); Fields responseHeaders = replyInfo.getHeaders(); short version = stream.getSession().getVersion(); @@ -212,7 +215,8 @@ public class HttpTransportOverSPDY implements HttpTransport final Fields pushRequestHeaders = createRequestHeaders(scheme, host, uri, pushResource); // TODO: handle the timeout better - stream.syn(new SynInfo(pushHeaders, false), 0, TimeUnit.MILLISECONDS, new Promise.Adapter() + stream.syn(new SynInfo(0, TimeUnit.MILLISECONDS, pushHeaders, false, (byte)0), + new Promise.Adapter() { @Override public void succeeded(Stream pushStream) diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyEngineSelector.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyEngineSelector.java index 38ac82bb38e..1ce6b7e5763 100644 --- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyEngineSelector.java +++ b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyEngineSelector.java @@ -23,8 +23,8 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.eclipse.jetty.spdy.api.GoAwayInfo; -import org.eclipse.jetty.spdy.api.PingInfo; +import org.eclipse.jetty.spdy.api.GoAwayReceivedInfo; +import org.eclipse.jetty.spdy.api.PingResultInfo; import org.eclipse.jetty.spdy.api.RstInfo; import org.eclipse.jetty.spdy.api.Session; import org.eclipse.jetty.spdy.api.Stream; @@ -33,6 +33,7 @@ import org.eclipse.jetty.spdy.api.StreamStatus; import org.eclipse.jetty.spdy.api.SynInfo; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; import org.eclipse.jetty.spdy.server.http.HTTPSPDYHeader; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Fields; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; @@ -96,14 +97,14 @@ public class ProxyEngineSelector extends ServerSessionFrameListener.Adapter } @Override - public void onPing(Session clientSession, PingInfo pingInfo) + public void onPing(Session clientSession, PingResultInfo pingResultInfo) { // We do not know to which upstream server // to send the PING so we just ignore it } @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayReceivedInfo) { // TODO: } @@ -153,7 +154,7 @@ public class ProxyEngineSelector extends ServerSessionFrameListener.Adapter private void rst(Stream stream) { RstInfo rstInfo = new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM); - stream.getSession().rst(rstInfo); + stream.getSession().rst(rstInfo, new Callback.Adapter()); } public static class ProxyServerInfo diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPSPDYConnection.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPSPDYConnection.java index 5c3ffb7f283..b24d4ac1513 100644 --- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPSPDYConnection.java +++ b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPSPDYConnection.java @@ -20,8 +20,6 @@ package org.eclipse.jetty.spdy.server.proxy; import java.io.IOException; import java.nio.ByteBuffer; -import java.util.Locale; -import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -44,6 +42,7 @@ import org.eclipse.jetty.spdy.StandardStream; import org.eclipse.jetty.spdy.api.ByteBufferDataInfo; import org.eclipse.jetty.spdy.api.DataInfo; import org.eclipse.jetty.spdy.api.GoAwayInfo; +import org.eclipse.jetty.spdy.api.GoAwayReceivedInfo; import org.eclipse.jetty.spdy.api.HeadersInfo; import org.eclipse.jetty.spdy.api.ReplyInfo; import org.eclipse.jetty.spdy.api.RstInfo; @@ -135,7 +134,7 @@ public class ProxyHTTPSPDYConnection extends HttpConnection implements HttpParse { assert content == null; if (headers.isEmpty()) - proxyEngineSelector.onGoAway(session, new GoAwayInfo(0, SessionStatus.OK)); + proxyEngineSelector.onGoAway(session, new GoAwayReceivedInfo(0, SessionStatus.OK)); else syn(true); } @@ -184,14 +183,14 @@ public class ProxyHTTPSPDYConnection extends HttpConnection implements HttpParse } @Override - public void rst(RstInfo rstInfo, long timeout, TimeUnit unit, Callback handler) + public void rst(RstInfo rstInfo, Callback handler) { // Not much we can do in HTTP land: just close the connection - goAway(timeout, unit, handler); + goAway(new GoAwayInfo(rstInfo.getTimeout(), rstInfo.getUnit()), handler); } @Override - public void goAway(long timeout, TimeUnit unit, Callback handler) + public void goAway(GoAwayInfo goAwayInfo, Callback handler) { getEndPoint().close(); handler.succeeded(); @@ -211,21 +210,21 @@ public class ProxyHTTPSPDYConnection extends HttpConnection implements HttpParse } @Override - public void syn(SynInfo synInfo, long timeout, TimeUnit unit, Promise handler) + public void syn(SynInfo synInfo, Promise handler) { // HTTP does not support pushed streams handler.succeeded(new HTTPPushStream(2, getPriority(), getSession(), this)); } @Override - public void headers(HeadersInfo headersInfo, long timeout, TimeUnit unit, Callback handler) + public void headers(HeadersInfo headersInfo, Callback handler) { // TODO throw new UnsupportedOperationException("Not Yet Implemented"); } @Override - public void reply(ReplyInfo replyInfo, long timeout, TimeUnit unit, Callback handler) + public void reply(ReplyInfo replyInfo, Callback handler) { try { @@ -284,7 +283,7 @@ public class ProxyHTTPSPDYConnection extends HttpConnection implements HttpParse } @Override - public void data(DataInfo dataInfo, long timeout, TimeUnit unit, Callback handler) + public void data(DataInfo dataInfo, Callback handler) { try { @@ -313,14 +312,14 @@ public class ProxyHTTPSPDYConnection extends HttpConnection implements HttpParse } @Override - public void headers(HeadersInfo headersInfo, long timeout, TimeUnit unit, Callback handler) + public void headers(HeadersInfo headersInfo, Callback handler) { // Ignore pushed headers handler.succeeded(); } @Override - public void data(DataInfo dataInfo, long timeout, TimeUnit unit, Callback handler) + public void data(DataInfo dataInfo, Callback handler) { // Ignore pushed data handler.succeeded(); diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/SPDYProxyEngine.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/SPDYProxyEngine.java index 4be0f290ea8..33075f5019f 100644 --- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/SPDYProxyEngine.java +++ b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/SPDYProxyEngine.java @@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit; import org.eclipse.jetty.spdy.api.ByteBufferDataInfo; import org.eclipse.jetty.spdy.api.DataInfo; import org.eclipse.jetty.spdy.api.GoAwayInfo; +import org.eclipse.jetty.spdy.api.GoAwayReceivedInfo; import org.eclipse.jetty.spdy.api.HeadersInfo; import org.eclipse.jetty.spdy.api.ReplyInfo; import org.eclipse.jetty.spdy.api.RstInfo; @@ -108,7 +109,7 @@ public class SPDYProxyEngine extends ProxyEngine implements StreamFrameListener StreamFrameListener listener = new ProxyStreamFrameListener(clientStream); StreamHandler handler = new StreamHandler(clientStream, serverSynInfo); clientStream.setAttribute(STREAM_HANDLER_ATTRIBUTE, handler); - serverSession.syn(serverSynInfo, listener, timeout, TimeUnit.MILLISECONDS, handler); + serverSession.syn(serverSynInfo, listener, handler); return this; } @@ -170,7 +171,7 @@ public class SPDYProxyEngine extends ProxyEngine implements StreamFrameListener Session existing = serverSessions.putIfAbsent(host, session); if (existing != null) { - session.goAway(getTimeout(), TimeUnit.MILLISECONDS, new Callback.Adapter()); + session.goAway(new GoAwayInfo(), new Callback.Adapter()); session = existing; } } @@ -203,7 +204,7 @@ public class SPDYProxyEngine extends ProxyEngine implements StreamFrameListener private void rst(Stream stream) { RstInfo rstInfo = new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM); - stream.getSession().rst(rstInfo, getTimeout(), TimeUnit.MILLISECONDS, new Callback.Adapter()); + stream.getSession().rst(rstInfo, new Callback.Adapter()); } private class ProxyStreamFrameListener extends StreamFrameListener.Adapter @@ -259,7 +260,7 @@ public class SPDYProxyEngine extends ProxyEngine implements StreamFrameListener { final ReplyInfo replyInfo = this.replyInfo; this.replyInfo = null; - clientStream.reply(replyInfo, getTimeout(), TimeUnit.MILLISECONDS, new Callback() + clientStream.reply(replyInfo, new Callback() { @Override public void succeeded() @@ -278,7 +279,7 @@ public class SPDYProxyEngine extends ProxyEngine implements StreamFrameListener private void data(final Stream stream, final DataInfo dataInfo) { - clientStream.data(dataInfo, getTimeout(), TimeUnit.MILLISECONDS, new Callback() + clientStream.data(dataInfo, new Callback() //TODO: timeout??? { @Override public void succeeded() @@ -394,7 +395,7 @@ public class SPDYProxyEngine extends ProxyEngine implements StreamFrameListener private void flush(Stream serverStream, DataInfoHandler dataInfoHandler) { logger.debug("P -> S {} on {}", dataInfoHandler.dataInfo, serverStream); - serverStream.data(dataInfoHandler.dataInfo, getTimeout(), TimeUnit.MILLISECONDS,dataInfoHandler); + serverStream.data(dataInfoHandler.dataInfo, dataInfoHandler); //TODO: timeout??? } private class DataInfoHandler implements Callback @@ -459,8 +460,8 @@ public class SPDYProxyEngine extends ProxyEngine implements StreamFrameListener StreamHandler handler = new StreamHandler(clientStream, serverSynInfo); serverStream.setAttribute(STREAM_HANDLER_ATTRIBUTE, handler); - clientStream.syn(new SynInfo(headers, serverSynInfo.isClose()), getTimeout(), TimeUnit.MILLISECONDS, handler); - + clientStream.syn(new SynInfo(getTimeout(), TimeUnit.MILLISECONDS, headers, serverSynInfo.isClose(), + (byte)0), handler); return this; } @@ -475,13 +476,13 @@ public class SPDYProxyEngine extends ProxyEngine implements StreamFrameListener { Session clientSession = clientStream.getSession(); RstInfo clientRstInfo = new RstInfo(clientStream.getId(), serverRstInfo.getStreamStatus()); - clientSession.rst(clientRstInfo, getTimeout(), TimeUnit.MILLISECONDS, new Callback.Adapter()); + clientSession.rst(clientRstInfo, new Callback.Adapter()); } } } @Override - public void onGoAway(Session serverSession, GoAwayInfo goAwayInfo) + public void onGoAway(Session serverSession, GoAwayReceivedInfo goAwayReceivedInfo) { serverSessions.values().remove(serverSession); } diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDYTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDYTest.java index c25e73a0e30..ff33793eb09 100644 --- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDYTest.java +++ b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDYTest.java @@ -21,7 +21,6 @@ package org.eclipse.jetty.spdy.server.http; import java.io.IOException; import java.nio.ByteBuffer; import java.util.Random; -import java.util.concurrent.TimeUnit; import org.eclipse.jetty.http.HttpGenerator; import org.eclipse.jetty.http.HttpStatus; @@ -49,7 +48,6 @@ import org.mockito.runners.MockitoJUnitRunner; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyLong; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -97,7 +95,7 @@ public class HttpTransportOverSPDYTest httpTransportOverSPDY.send(null, content, lastContent, callback); ArgumentCaptor dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class); - verify(stream, times(1)).data(dataInfoCaptor.capture(), anyLong(), any(TimeUnit.class), any(Callback.class)); + verify(stream, times(1)).data(dataInfoCaptor.capture(), any(Callback.class)); assertThat("lastContent is true", dataInfoCaptor.getValue().isClose(), is(true)); assertThat("ByteBuffer is empty", dataInfoCaptor.getValue().length(), is(0)); } @@ -108,11 +106,10 @@ public class HttpTransportOverSPDYTest ByteBuffer content = createRandomByteBuffer(); boolean lastContent = true; - httpTransportOverSPDY.send(null, content, lastContent, callback); ArgumentCaptor dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class); - verify(stream, times(1)).data(dataInfoCaptor.capture(), anyLong(), any(TimeUnit.class), any(Callback.class)); + verify(stream, times(1)).data(dataInfoCaptor.capture(), any(Callback.class)); assertThat("lastContent is true", dataInfoCaptor.getValue().isClose(), is(true)); assertThat("ByteBuffer length is 4096", dataInfoCaptor.getValue().length(), is(4096)); } @@ -126,7 +123,7 @@ public class HttpTransportOverSPDYTest httpTransportOverSPDY.send(null, content, lastContent, callback); ArgumentCaptor dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class); - verify(stream, times(1)).data(dataInfoCaptor.capture(), anyLong(), any(TimeUnit.class), any(Callback.class)); + verify(stream, times(1)).data(dataInfoCaptor.capture(), any(Callback.class)); assertThat("lastContent is true", dataInfoCaptor.getValue().isClose(), is(true)); assertThat("ByteBuffer is empty", dataInfoCaptor.getValue().length(), is(0)); } @@ -139,7 +136,7 @@ public class HttpTransportOverSPDYTest httpTransportOverSPDY.send(null, content, lastContent, callback); - verify(stream, times(0)).data(any(ByteBufferDataInfo.class), anyLong(), any(TimeUnit.class), any(Callback.class)); + verify(stream, times(0)).data(any(ByteBufferDataInfo.class), any(Callback.class)); } @Test @@ -151,7 +148,7 @@ public class HttpTransportOverSPDYTest httpTransportOverSPDY.send(null, content, lastContent, callback); ArgumentCaptor dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class); - verify(stream, times(1)).data(dataInfoCaptor.capture(), anyLong(), any(TimeUnit.class), any(Callback.class)); + verify(stream, times(1)).data(dataInfoCaptor.capture(), any(Callback.class)); assertThat("lastContent is false", dataInfoCaptor.getValue().isClose(), is(false)); assertThat("ByteBuffer is empty", dataInfoCaptor.getValue().length(), is(4096)); } @@ -164,7 +161,7 @@ public class HttpTransportOverSPDYTest httpTransportOverSPDY.send(null, content, lastContent, callback); - verify(stream, times(0)).data(any(ByteBufferDataInfo.class), anyLong(), any(TimeUnit.class), any(Callback.class)); + verify(stream, times(0)).data(any(ByteBufferDataInfo.class), any(Callback.class)); verify(callback, times(1)).succeeded(); } @@ -179,7 +176,7 @@ public class HttpTransportOverSPDYTest httpTransportOverSPDY.send(responseInfo, content, lastContent, callback); ArgumentCaptor replyInfoCaptor = ArgumentCaptor.forClass(ReplyInfo.class); - verify(stream, times(1)).reply(replyInfoCaptor.capture()); + verify(stream, times(1)).reply(replyInfoCaptor.capture(), any(Callback.class)); assertThat("ReplyInfo close is true", replyInfoCaptor.getValue().isClose(), is(true)); verify(callback, times(1)).succeeded(); @@ -196,11 +193,11 @@ public class HttpTransportOverSPDYTest httpTransportOverSPDY.send(responseInfo, content, lastContent, callback); ArgumentCaptor replyInfoCaptor = ArgumentCaptor.forClass(ReplyInfo.class); - verify(stream, times(1)).reply(replyInfoCaptor.capture()); + verify(stream, times(1)).reply(replyInfoCaptor.capture(), any(Callback.class)); assertThat("ReplyInfo close is false", replyInfoCaptor.getValue().isClose(), is(false)); ArgumentCaptor dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class); - verify(stream, times(1)).data(dataInfoCaptor.capture(), anyLong(), any(TimeUnit.class), any(Callback.class)); + verify(stream, times(1)).data(dataInfoCaptor.capture(), any(Callback.class)); assertThat("lastContent is true", dataInfoCaptor.getValue().isClose(), is(true)); assertThat("ByteBuffer length is 4096", dataInfoCaptor.getValue().length(), is(4096)); } @@ -214,10 +211,10 @@ public class HttpTransportOverSPDYTest httpTransportOverSPDY.send(responseInfo, content, lastContent, callback); ArgumentCaptor replyInfoCaptor = ArgumentCaptor.forClass(ReplyInfo.class); - verify(stream, times(1)).reply(replyInfoCaptor.capture()); + verify(stream, times(1)).reply(replyInfoCaptor.capture(), any(Callback.class)); assertThat("ReplyInfo close is true", replyInfoCaptor.getValue().isClose(), is(false)); - verify(stream, times(0)).data(any(ByteBufferDataInfo.class), anyLong(), any(TimeUnit.class), any(Callback.class)); + verify(stream, times(0)).data(any(ByteBufferDataInfo.class), any(Callback.class)); } @Test @@ -230,11 +227,11 @@ public class HttpTransportOverSPDYTest httpTransportOverSPDY.send(responseInfo, content, lastContent, callback); ArgumentCaptor replyInfoCaptor = ArgumentCaptor.forClass(ReplyInfo.class); - verify(stream, times(1)).reply(replyInfoCaptor.capture()); + verify(stream, times(1)).reply(replyInfoCaptor.capture(), any(Callback.class)); assertThat("ReplyInfo close is false", replyInfoCaptor.getValue().isClose(), is(false)); ArgumentCaptor dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class); - verify(stream, times(1)).data(dataInfoCaptor.capture(), anyLong(), any(TimeUnit.class), any(Callback.class)); + verify(stream, times(1)).data(dataInfoCaptor.capture(), any(Callback.class)); assertThat("lastContent is false", dataInfoCaptor.getValue().isClose(), is(false)); assertThat("ByteBuffer length is 4096", dataInfoCaptor.getValue().length(), is(4096)); } @@ -248,13 +245,12 @@ public class HttpTransportOverSPDYTest httpTransportOverSPDY.send(responseInfo,content,lastContent, callback); ArgumentCaptor replyInfoCaptor = ArgumentCaptor.forClass(ReplyInfo.class); - verify(stream, times(1)).reply(replyInfoCaptor.capture()); + verify(stream, times(1)).reply(replyInfoCaptor.capture(), any(Callback.class)); assertThat("ReplyInfo close is false", replyInfoCaptor.getValue().isClose(), is(false)); httpTransportOverSPDY.send(HttpGenerator.RESPONSE_500_INFO, null,true); - verify(stream, times(0)).data(any(DataInfo.class)); - verify(stream, times(1)).data(any(DataInfo.class), anyLong(), any(TimeUnit.class), any(Callback.class)); + verify(stream, times(1)).data(any(DataInfo.class), any(Callback.class)); ((StdErrLog)Log.getLogger(HttpTransportOverSPDY.class)).setHideStacks(false); } diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/PushStrategyBenchmarkTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/PushStrategyBenchmarkTest.java index e87ddfc1de7..14c0a9d31bd 100644 --- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/PushStrategyBenchmarkTest.java +++ b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/PushStrategyBenchmarkTest.java @@ -43,6 +43,7 @@ import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.spdy.api.DataInfo; +import org.eclipse.jetty.spdy.api.GoAwayInfo; import org.eclipse.jetty.spdy.api.SPDY; import org.eclipse.jetty.spdy.api.Session; import org.eclipse.jetty.spdy.api.SessionFrameListener; @@ -97,7 +98,7 @@ public class PushStrategyBenchmarkTest extends AbstractHTTPSPDYTest connector.setDefaultProtocol(factory.getProtocol()); Session session = startClient(version, address, new ClientSessionFrameListener()); benchmarkSPDY(pushStrategy, session); - session.goAway().get(5, TimeUnit.SECONDS); + session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); // Second push strategy pushStrategy = new ReferrerPushStrategy(); @@ -105,7 +106,7 @@ public class PushStrategyBenchmarkTest extends AbstractHTTPSPDYTest connector.setDefaultProtocol(factory.getProtocol()); session = startClient(version, address, new ClientSessionFrameListener()); benchmarkSPDY(pushStrategy, session); - session.goAway().get(5, TimeUnit.SECONDS); + session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); } private void benchmarkHTTP(HttpClient httpClient) throws Exception diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategyTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategyTest.java index 98ce863d837..b07f0a9903b 100644 --- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategyTest.java +++ b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategyTest.java @@ -43,7 +43,9 @@ import org.eclipse.jetty.spdy.api.StreamFrameListener; import org.eclipse.jetty.spdy.api.StreamStatus; import org.eclipse.jetty.spdy.api.SynInfo; import org.eclipse.jetty.spdy.server.NPNServerConnectionFactory; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Fields; +import org.eclipse.jetty.util.Promise; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -117,7 +119,7 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest ("" + ".css"), is(true)); - stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM)); + stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new Callback.Adapter()); return new StreamFrameListener.Adapter() { @@ -224,7 +226,7 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest if (dataInfo.isClose()) dataReceivedLatch.countDown(); } - }); + }, new Promise.Adapter()); Assert.assertTrue(received200OKLatch.await(5, TimeUnit.SECONDS)); Assert.assertTrue(dataReceivedLatch.await(5, TimeUnit.SECONDS)); } diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java index 42c41057446..99fe67ae614 100644 --- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java +++ b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java @@ -202,7 +202,8 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Fields headers = createHeaders("POST", path); headers.put("content-type", "application/x-www-form-urlencoded"); final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), + new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -212,7 +213,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Assert.assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).value().contains("200")); replyLatch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); stream.data(new StringDataInfo(data, true)); Assert.assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); @@ -243,7 +244,8 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Fields headers = createHeaders("POST", path); headers.put("content-type", "application/x-www-form-urlencoded"); final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), + new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -253,7 +255,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Assert.assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).value().contains("200")); replyLatch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); // Sleep between the data frames so that they will be read in 2 reads stream.data(new StringDataInfo(data1, false)); Thread.sleep(1000); @@ -287,7 +289,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Fields headers = createHeaders("POST", path); headers.put("content-type", "application/x-www-form-urlencoded"); final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -297,7 +299,8 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Assert.assertTrue(replyHeaders.toString(), replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).value().contains("200")); replyLatch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); + // Send the data frames consecutively, so the server reads both frames in one read stream.data(new StringDataInfo(data1, false)); stream.data(new StringDataInfo(data2, true)); @@ -1034,7 +1037,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Fields headers = createHeaders("POST", "/foo"); final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -1043,7 +1046,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Assert.assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).value().contains("200")); replyLatch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); stream.data(new BytesDataInfo(data, true)); Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); @@ -1077,7 +1080,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Fields headers = createHeaders("POST", "/foo"); final CountDownLatch replyLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() + session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, true, (byte)0), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -1086,7 +1089,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Assert.assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).value().contains("200")); replyLatch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); Assert.assertTrue("Not dispatched again after expire", dispatchedAgainAfterExpire.await(5, TimeUnit.SECONDS)); @@ -1122,7 +1125,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Fields headers = createHeaders("POST", "/foo"); final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -1131,7 +1134,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Assert.assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).value().contains("200")); replyLatch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); stream.data(new BytesDataInfo(data, true)); Assert.assertTrue("Not dispatched again after expire", dispatchedAgainAfterExpire.await(5, @@ -1190,7 +1193,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Fields headers = createHeaders("POST", "/foo"); final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -1199,7 +1202,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Assert.assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).value().contains("200")); replyLatch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); stream.data(new BytesDataInfo(data, false)); stream.data(new BytesDataInfo(data, true)); @@ -1258,7 +1261,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Fields headers = createHeaders("POST", "/foo"); final CountDownLatch responseLatch = new CountDownLatch(2); - Stream stream = session.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -1274,7 +1277,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest if (dataInfo.isClose()) responseLatch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); stream.data(new BytesDataInfo(data, true)); Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); @@ -1299,7 +1302,7 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Fields headers = createHeaders("POST", "/foo"); final CountDownLatch responseLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -1308,9 +1311,9 @@ public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest Assert.assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).value().contains("200")); responseLatch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); stream.data(new BytesDataInfo(data, false)); - stream.data(new BytesDataInfo(data, true)).get(5, TimeUnit.SECONDS); + stream.data(new BytesDataInfo(5, TimeUnit.SECONDS, data, true)); Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); Assert.assertTrue(responseLatch.await(5, TimeUnit.SECONDS)); diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPSPDYTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPSPDYTest.java index d63d255e4cf..bd6d6836941 100644 --- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPSPDYTest.java +++ b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPSPDYTest.java @@ -35,7 +35,9 @@ import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.spdy.api.BytesDataInfo; import org.eclipse.jetty.spdy.api.DataInfo; import org.eclipse.jetty.spdy.api.GoAwayInfo; +import org.eclipse.jetty.spdy.api.GoAwayReceivedInfo; import org.eclipse.jetty.spdy.api.PingInfo; +import org.eclipse.jetty.spdy.api.PingResultInfo; import org.eclipse.jetty.spdy.api.ReplyInfo; import org.eclipse.jetty.spdy.api.RstInfo; import org.eclipse.jetty.spdy.api.SPDY; @@ -159,12 +161,12 @@ public class ProxyHTTPSPDYTest Fields responseHeaders = new Fields(); responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1"); responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK"); - stream.reply(new ReplyInfo(responseHeaders, true)); + stream.reply(new ReplyInfo(responseHeaders, true), new Callback.Adapter()); return null; } @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { closeLatch.countDown(); } @@ -211,7 +213,7 @@ public class ProxyHTTPSPDYTest responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1"); responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK"); ReplyInfo replyInfo = new ReplyInfo(responseHeaders, true); - stream.reply(replyInfo); + stream.reply(replyInfo, new Callback.Adapter()); return null; } })); @@ -272,8 +274,8 @@ public class ProxyHTTPSPDYTest responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1"); responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK"); ReplyInfo replyInfo = new ReplyInfo(responseHeaders, false); - stream.reply(replyInfo); - stream.data(new BytesDataInfo(data, true)); + stream.reply(replyInfo, new Callback.Adapter()); + stream.data(new BytesDataInfo(data, true), new Callback.Adapter()); return null; } @@ -335,7 +337,7 @@ public class ProxyHTTPSPDYTest Fields headers = new Fields(); headers.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1"); headers.put(HTTPSPDYHeader.STATUS.name(version), "303 See Other"); - stream.reply(new ReplyInfo(headers, true)); + stream.reply(new ReplyInfo(headers, true), new Callback.Adapter()); } } }; @@ -399,8 +401,8 @@ public class ProxyHTTPSPDYTest responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1"); responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK"); ReplyInfo replyInfo = new ReplyInfo(responseHeaders, false); - stream.reply(replyInfo); - stream.data(new BytesDataInfo(data, true)); + stream.reply(replyInfo, new Callback.Adapter()); + stream.data(new BytesDataInfo(data, true), new Callback.Adapter()); } } }; @@ -462,7 +464,7 @@ public class ProxyHTTPSPDYTest Fields responseHeaders = new Fields(); responseHeaders.put(header, "baz"); - stream.reply(new ReplyInfo(responseHeaders, true)); + stream.reply(new ReplyInfo(responseHeaders, true), new Callback.Adapter()); return null; } })); @@ -487,7 +489,7 @@ public class ProxyHTTPSPDYTest Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - client.goAway().get(5, TimeUnit.SECONDS); + client.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); } @Test @@ -506,8 +508,8 @@ public class ProxyHTTPSPDYTest Fields responseHeaders = new Fields(); responseHeaders.put(header, "baz"); - stream.reply(new ReplyInfo(responseHeaders, false)); - stream.data(new BytesDataInfo(data, true)); + stream.reply(new ReplyInfo(responseHeaders, false), new Callback.Adapter()); + stream.data(new BytesDataInfo(data, true), new Callback.Adapter()); return null; } })); @@ -547,7 +549,7 @@ public class ProxyHTTPSPDYTest Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - client.goAway().get(5, TimeUnit.SECONDS); + client.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); } @Test @@ -565,16 +567,16 @@ public class ProxyHTTPSPDYTest Fields pushHeaders = new Fields(); pushHeaders.put(HTTPSPDYHeader.URI.name(version), "/push"); - stream.syn(new SynInfo(pushHeaders, false), 5, TimeUnit.SECONDS, new Promise.Adapter() + stream.syn(new SynInfo(5, TimeUnit.SECONDS, pushHeaders, false, (byte)0), new Promise.Adapter() { @Override public void succeeded(Stream pushStream) { - pushStream.data(new BytesDataInfo(data, true)); + pushStream.data(new BytesDataInfo(data, true), new Callback.Adapter()); } }); - stream.reply(new ReplyInfo(responseHeaders, true)); + stream.reply(new ReplyInfo(responseHeaders, true), new Callback.Adapter()); return null; } })); @@ -614,20 +616,20 @@ public class ProxyHTTPSPDYTest Fields responseHeaders = new Fields(); responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1"); responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK"); - stream.reply(new ReplyInfo(responseHeaders, false)); + stream.reply(new ReplyInfo(responseHeaders, false), new Callback.Adapter()); Fields pushHeaders = new Fields(); pushHeaders.put(HTTPSPDYHeader.URI.name(version), "/push"); - stream.syn(new SynInfo(pushHeaders, false), 5, TimeUnit.SECONDS, new Promise.Adapter() + stream.syn(new SynInfo(5, TimeUnit.SECONDS, pushHeaders, false, (byte)0), new Promise.Adapter() { @Override public void succeeded(Stream pushStream) { - pushStream.data(new BytesDataInfo(data, true)); + pushStream.data(new BytesDataInfo(data, true), new Callback.Adapter()); } }); - stream.data(new BytesDataInfo(data, true)); + stream.data(new BytesDataInfo(data, true), new Callback.Adapter()); return null; } @@ -681,7 +683,7 @@ public class ProxyHTTPSPDYTest Assert.assertTrue(pushDataLatch.await(5, TimeUnit.SECONDS)); Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - client.goAway().get(5, TimeUnit.SECONDS); + client.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); } @Test @@ -697,17 +699,17 @@ public class ProxyHTTPSPDYTest Session client = factory.newSPDYClient(version).connect(proxyAddress, new SessionFrameListener.Adapter() { @Override - public void onPing(Session session, PingInfo pingInfo) + public void onPing(Session session, PingResultInfo pingInfo) { pingLatch.countDown(); } }).get(5, TimeUnit.SECONDS); - client.ping().get(5, TimeUnit.SECONDS); + client.ping(new PingInfo(5, TimeUnit.SECONDS)); Assert.assertTrue(pingLatch.await(5, TimeUnit.SECONDS)); - client.goAway().get(5, TimeUnit.SECONDS); + client.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); } @Test @@ -722,7 +724,7 @@ public class ProxyHTTPSPDYTest Fields requestHeaders = synInfo.getHeaders(); Assert.assertNotNull(requestHeaders.get("via")); - stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM)); + stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new Callback.Adapter()); return null; } @@ -758,7 +760,7 @@ public class ProxyHTTPSPDYTest Fields requestHeaders = synInfo.getHeaders(); Assert.assertNotNull(requestHeaders.get("via")); - stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM)); + stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new Callback.Adapter()); return null; } @@ -781,6 +783,6 @@ public class ProxyHTTPSPDYTest Assert.assertTrue(resetLatch.await(5, TimeUnit.SECONDS)); - client.goAway().get(5, TimeUnit.SECONDS); + client.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); } } diff --git a/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/SPDYServerConnectionFactory.java b/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/SPDYServerConnectionFactory.java index 558a2a8b674..7cebab5e713 100644 --- a/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/SPDYServerConnectionFactory.java +++ b/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/SPDYServerConnectionFactory.java @@ -32,18 +32,24 @@ import org.eclipse.jetty.spdy.CompressionFactory; import org.eclipse.jetty.spdy.FlowControlStrategy; import org.eclipse.jetty.spdy.StandardCompressionFactory; import org.eclipse.jetty.spdy.StandardSession; +import org.eclipse.jetty.spdy.api.GoAwayInfo; import org.eclipse.jetty.spdy.api.Session; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; import org.eclipse.jetty.spdy.client.FlowControlStrategyFactory; import org.eclipse.jetty.spdy.client.SPDYConnection; import org.eclipse.jetty.spdy.generator.Generator; import org.eclipse.jetty.spdy.parser.Parser; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedObject; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; @ManagedObject("SPDY Server Connection Factory") public class SPDYServerConnectionFactory extends AbstractConnectionFactory { + private static final Logger LOG = Log.getLogger(SPDYServerConnectionFactory.class); + // This method is placed here so as to provide a check for NPN before attempting to load any // NPN classes. public static void checkNPNAvailable() @@ -51,15 +57,15 @@ public class SPDYServerConnectionFactory extends AbstractConnectionFactory try { Class npn = ClassLoader.getSystemClassLoader().loadClass("org.eclipse.jetty.npn.NextProtoNego"); - if (npn.getClassLoader()!=null) + if (npn.getClassLoader() != null) throw new IllegalStateException("NextProtoNego must be on JVM boot path"); } catch (ClassNotFoundException e) { - throw new IllegalStateException("No NextProtoNego on boot path",e); + throw new IllegalStateException("No NextProtoNego on boot path", e); } } - + private final short version; private final ServerSessionFrameListener listener; private int initialWindowSize; @@ -70,9 +76,9 @@ public class SPDYServerConnectionFactory extends AbstractConnectionFactory this(version, null); } - public SPDYServerConnectionFactory(int version, ServerSessionFrameListener listener) + public SPDYServerConnectionFactory(int version, ServerSessionFrameListener listener) { - super("spdy/"+version); + super("spdy/" + version); this.version = (short)version; this.listener = listener; setInitialWindowSize(65536); @@ -96,8 +102,8 @@ public class SPDYServerConnectionFactory extends AbstractConnectionFactory Parser parser = new Parser(compressionFactory.newDecompressor()); Generator generator = new Generator(connector.getByteBufferPool(), compressionFactory.newCompressor()); - ServerSessionFrameListener listener = provideServerSessionFrameListener(connector,endPoint); - SPDYConnection connection = new ServerSPDYConnection(connector,endPoint, parser, listener, getInputBufferSize()); + ServerSessionFrameListener listener = provideServerSessionFrameListener(connector, endPoint); + SPDYConnection connection = new ServerSPDYConnection(connector, endPoint, parser, listener, getInputBufferSize()); FlowControlStrategy flowControlStrategy = newFlowControlStrategy(version); @@ -110,7 +116,7 @@ public class SPDYServerConnectionFactory extends AbstractConnectionFactory sessionOpened(session); - return configure(connection,connector,endPoint); + return configure(connection, connector, endPoint); } protected FlowControlStrategy newFlowControlStrategy(short version) @@ -150,7 +156,7 @@ public class SPDYServerConnectionFactory extends AbstractConnectionFactory void closeSessions() { for (Session session : sessions) - session.goAway(); + session.goAway(new GoAwayInfo(), new Callback.Adapter()); sessions.clear(); } @@ -171,9 +177,9 @@ public class SPDYServerConnectionFactory extends AbstractConnectionFactory private final ServerSessionFrameListener listener; private final AtomicBoolean connected = new AtomicBoolean(); - private ServerSPDYConnection(Connector connector,EndPoint endPoint, Parser parser, ServerSessionFrameListener listener, int bufferSize) + private ServerSPDYConnection(Connector connector, EndPoint endPoint, Parser parser, ServerSessionFrameListener listener, int bufferSize) { - super(endPoint, connector.getByteBufferPool(), parser, connector.getExecutor(),bufferSize); + super(endPoint, connector.getByteBufferPool(), parser, connector.getExecutor(), bufferSize); this.listener = listener; } diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ClosedStreamTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ClosedStreamTest.java index 4060c192e89..38e5e9a01ac 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ClosedStreamTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ClosedStreamTest.java @@ -31,6 +31,7 @@ import org.eclipse.jetty.spdy.StandardCompressionFactory; import org.eclipse.jetty.spdy.api.BytesDataInfo; import org.eclipse.jetty.spdy.api.DataInfo; import org.eclipse.jetty.spdy.api.GoAwayInfo; +import org.eclipse.jetty.spdy.api.GoAwayReceivedInfo; import org.eclipse.jetty.spdy.api.ReplyInfo; import org.eclipse.jetty.spdy.api.SPDY; import org.eclipse.jetty.spdy.api.Session; @@ -48,6 +49,7 @@ import org.eclipse.jetty.spdy.frames.SynStreamFrame; import org.eclipse.jetty.spdy.generator.Generator; import org.eclipse.jetty.spdy.parser.Parser; import org.eclipse.jetty.spdy.parser.Parser.Listener; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Fields; import org.junit.Assert; import org.junit.Ignore; @@ -69,7 +71,7 @@ public class ClosedStreamTest extends AbstractTest Session session = startClient(new InetSocketAddress("localhost", server.socket().getLocalPort()), null); final CountDownLatch dataLatch = new CountDownLatch(2); - session.syn(new SynInfo(true), new StreamFrameListener.Adapter() + session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter() { @Override public void onData(Stream stream, DataInfo dataInfo) @@ -102,7 +104,7 @@ public class ClosedStreamTest extends AbstractTest Assert.assertFalse(dataLatch.await(1, TimeUnit.SECONDS)); - session.goAway().get(5, TimeUnit.SECONDS); + session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); server.close(); } @@ -119,7 +121,7 @@ public class ClosedStreamTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(true)); + stream.reply(new ReplyInfo(true), new Callback.Adapter()); try { replyReceivedLatch.await(5,TimeUnit.SECONDS); @@ -130,7 +132,7 @@ public class ClosedStreamTest extends AbstractTest } try { - stream.data(new StringDataInfo("data send after half closed",false)); + stream.data(new StringDataInfo("data send after half closed",false), new Callback.Adapter()); } catch (RuntimeException e) { @@ -142,7 +144,7 @@ public class ClosedStreamTest extends AbstractTest } }),null); - Stream stream = clientSession.syn(new SynInfo(false),new StreamFrameListener.Adapter() + Stream stream = clientSession.syn(new SynInfo(new Fields(), false),new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -155,7 +157,7 @@ public class ClosedStreamTest extends AbstractTest { clientReceivedDataLatch.countDown(); } - }).get(); + }); assertThat("reply has been received by client",replyReceivedLatch.await(5,TimeUnit.SECONDS),is(true)); assertThat("stream is half closed from server",stream.isHalfClosed(),is(true)); assertThat("client has not received any data sent after stream was half closed by server", @@ -189,7 +191,7 @@ public class ClosedStreamTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(false)); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); serverReplySentLatch.countDown(); try { @@ -209,7 +211,7 @@ public class ClosedStreamTest extends AbstractTest }; } @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { goAwayReceivedLatch.countDown(); } diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/FlowControlTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/FlowControlTest.java index 733d5725324..8a871821105 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/FlowControlTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/FlowControlTest.java @@ -42,6 +42,9 @@ import org.eclipse.jetty.spdy.api.Stream; import org.eclipse.jetty.spdy.api.StreamFrameListener; import org.eclipse.jetty.spdy.api.SynInfo; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; +import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.Fields; +import org.eclipse.jetty.util.FutureCallback; import org.junit.Assert; import org.junit.Test; @@ -66,7 +69,7 @@ public class FlowControlTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(true)); + stream.reply(new ReplyInfo(true), new Callback.Adapter()); return new StreamFrameListener.Adapter() { private final AtomicInteger dataFrames = new AtomicInteger(); @@ -80,7 +83,7 @@ public class FlowControlTest extends AbstractTest dataInfoRef.set(dataInfo); Settings settings = new Settings(); settings.put(new Settings.Setting(Settings.ID.INITIAL_WINDOW_SIZE, size)); - stream.getSession().settings(new SettingsInfo(settings)); + stream.getSession().settings(new SettingsInfo(settings), new FutureCallback()); } else if (dataFrameCount > 1) { @@ -99,12 +102,12 @@ public class FlowControlTest extends AbstractTest } }); - Stream stream = session.syn(new SynInfo(false), null).get(5, TimeUnit.SECONDS); + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null); stream.data(new BytesDataInfo(new byte[size * 2], false)); settingsLatch.await(5, TimeUnit.SECONDS); // Send the second chunk of data, must not arrive since we're flow control stalled now - stream.data(new BytesDataInfo(new byte[size * 2], true)); + stream.data(new BytesDataInfo(new byte[size * 2], true), new Callback.Adapter()); Assert.assertFalse(dataLatch.await(1, TimeUnit.SECONDS)); // Consume the data arrived to server, this will resume flow control @@ -131,8 +134,8 @@ public class FlowControlTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(false)); - stream.data(new BytesDataInfo(new byte[length], true)); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); + stream.data(new BytesDataInfo(new byte[length], true), new Callback.Adapter()); return null; } }), null); @@ -144,7 +147,7 @@ public class FlowControlTest extends AbstractTest Assert.assertTrue(settingsLatch.await(5, TimeUnit.SECONDS)); final Exchanger exchanger = new Exchanger<>(); - session.syn(new SynInfo(true), new StreamFrameListener.Adapter() + session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter() { private AtomicInteger dataFrames = new AtomicInteger(); @@ -230,13 +233,13 @@ public class FlowControlTest extends AbstractTest { Settings settings = new Settings(); settings.put(new Settings.Setting(Settings.ID.INITIAL_WINDOW_SIZE, windowSize)); - session.settings(new SettingsInfo(settings)); + session.settings(new SettingsInfo(settings), new FutureCallback()); } @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(false)); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); return new StreamFrameListener.Adapter() { private AtomicInteger dataFrames = new AtomicInteger(); @@ -294,9 +297,9 @@ public class FlowControlTest extends AbstractTest Assert.assertTrue(settingsLatch.await(5, TimeUnit.SECONDS)); - Stream stream = session.syn(new SynInfo(false), null).get(5, TimeUnit.SECONDS); + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null); final int length = 5 * windowSize; - stream.data(new BytesDataInfo(new byte[length], true)); + stream.data(new BytesDataInfo(new byte[length], true), new Callback.Adapter()); DataInfo dataInfo = exchanger.exchange(null, 5, TimeUnit.SECONDS); checkThatWeAreFlowControlStalled(exchanger); @@ -341,8 +344,8 @@ public class FlowControlTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(false)); - stream.data(new BytesDataInfo(new byte[windowSize * 2], true)); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); + stream.data(new BytesDataInfo(new byte[windowSize * 2], true), new Callback.Adapter()); return null; } }), null); @@ -355,7 +358,7 @@ public class FlowControlTest extends AbstractTest final CountDownLatch latch = new CountDownLatch(3); final AtomicReference dataInfoRef1 = new AtomicReference<>(); final AtomicReference dataInfoRef2 = new AtomicReference<>(); - session.syn(new SynInfo(true), new StreamFrameListener.Adapter() + session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), new StreamFrameListener.Adapter() { private final AtomicInteger dataFrames = new AtomicInteger(); @@ -375,8 +378,8 @@ public class FlowControlTest extends AbstractTest latch.countDown(); } } - }).get(5, TimeUnit.SECONDS); - session.syn(new SynInfo(true), new StreamFrameListener.Adapter() + }); + session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), new StreamFrameListener.Adapter() { private final AtomicInteger dataFrames = new AtomicInteger(); @@ -396,8 +399,8 @@ public class FlowControlTest extends AbstractTest latch.countDown(); } } - }).get(5, TimeUnit.SECONDS); - session.syn(new SynInfo(true), new StreamFrameListener.Adapter() + }); + session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), new StreamFrameListener.Adapter() { @Override public void onData(Stream stream, DataInfo dataInfo) @@ -412,7 +415,7 @@ public class FlowControlTest extends AbstractTest if (dataInfo.isClose()) latch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); } @@ -440,13 +443,13 @@ public class FlowControlTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(false)); - stream.data(bigByteBufferDataInfo); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); + stream.data(bigByteBufferDataInfo, new Callback.Adapter()); return null; } }),new SessionFrameListener.Adapter()); - session.syn(new SynInfo(false),new StreamFrameListener.Adapter() + session.syn(new SynInfo(new Fields(), false),new StreamFrameListener.Adapter() { private int dataBytesReceived; diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/GoAwayTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/GoAwayTest.java index 804c98f9129..9e86e0d822d 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/GoAwayTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/GoAwayTest.java @@ -26,6 +26,7 @@ import java.util.concurrent.atomic.AtomicReference; import org.eclipse.jetty.spdy.api.DataInfo; import org.eclipse.jetty.spdy.api.GoAwayInfo; +import org.eclipse.jetty.spdy.api.GoAwayReceivedInfo; import org.eclipse.jetty.spdy.api.ReplyInfo; import org.eclipse.jetty.spdy.api.SPDYException; import org.eclipse.jetty.spdy.api.Session; @@ -36,6 +37,10 @@ import org.eclipse.jetty.spdy.api.StreamFrameListener; import org.eclipse.jetty.spdy.api.StringDataInfo; import org.eclipse.jetty.spdy.api.SynInfo; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; +import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.Fields; +import org.eclipse.jetty.util.FutureCallback; +import org.eclipse.jetty.util.FuturePromise; import org.hamcrest.CoreMatchers; import org.junit.Assert; import org.junit.Test; @@ -51,12 +56,12 @@ public class GoAwayTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(true)); + stream.reply(new ReplyInfo(true), new Callback.Adapter()); return null; } @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { Assert.assertEquals(0, goAwayInfo.getLastStreamId()); Assert.assertSame(SessionStatus.OK, goAwayInfo.getSessionStatus()); @@ -65,9 +70,9 @@ public class GoAwayTest extends AbstractTest }; Session session = startClient(startServer(serverSessionFrameListener), null); - session.syn(new SynInfo(true), null); + session.syn(new SynInfo(new Fields(), true), null); - session.goAway(); + session.goAway(new GoAwayInfo()); Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); } @@ -80,17 +85,17 @@ public class GoAwayTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(true)); - stream.getSession().goAway(); + stream.reply(new ReplyInfo(true), new Callback.Adapter()); + stream.getSession().goAway(new GoAwayInfo(), new FutureCallback()); return null; } }; - final AtomicReference ref = new AtomicReference<>(); + final AtomicReference ref = new AtomicReference<>(); final CountDownLatch latch = new CountDownLatch(1); SessionFrameListener clientSessionFrameListener = new SessionFrameListener.Adapter() { @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { ref.set(goAwayInfo); latch.countDown(); @@ -98,13 +103,13 @@ public class GoAwayTest extends AbstractTest }; Session session = startClient(startServer(serverSessionFrameListener), clientSessionFrameListener); - Stream stream1 = session.syn(new SynInfo(true), null).get(5, TimeUnit.SECONDS); + Stream stream1 = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), null); Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); - GoAwayInfo goAwayInfo = ref.get(); - Assert.assertNotNull(goAwayInfo); - Assert.assertEquals(stream1.getId(), goAwayInfo.getLastStreamId()); - Assert.assertSame(SessionStatus.OK, goAwayInfo.getSessionStatus()); + GoAwayReceivedInfo goAwayReceivedInfo = ref.get(); + Assert.assertNotNull(goAwayReceivedInfo); + Assert.assertEquals(stream1.getId(), goAwayReceivedInfo.getLastStreamId()); + Assert.assertSame(SessionStatus.OK, goAwayReceivedInfo.getSessionStatus()); } @Test @@ -121,8 +126,8 @@ public class GoAwayTest extends AbstractTest int synCount = syns.incrementAndGet(); if (synCount == 1) { - stream.reply(new ReplyInfo(true)); - stream.getSession().goAway(); + stream.reply(new ReplyInfo(true), new Callback.Adapter()); + stream.getSession().goAway(new GoAwayInfo(), new FutureCallback()); } else { @@ -134,14 +139,14 @@ public class GoAwayTest extends AbstractTest SessionFrameListener clientSessionFrameListener = new SessionFrameListener.Adapter() { @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { - session.syn(new SynInfo(true), null); + session.syn(new SynInfo(new Fields(), true), null, new FuturePromise()); } }; Session session = startClient(startServer(serverSessionFrameListener), clientSessionFrameListener); - session.syn(new SynInfo(true), null); + session.syn(new SynInfo(new Fields(), true), null); Assert.assertFalse(latch.await(1, TimeUnit.SECONDS)); } @@ -158,7 +163,7 @@ public class GoAwayTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(true)); + stream.reply(new ReplyInfo(true), new Callback.Adapter()); int synCount = syns.incrementAndGet(); if (synCount == 1) { @@ -166,7 +171,7 @@ public class GoAwayTest extends AbstractTest } else { - stream.getSession().goAway(); + stream.getSession().goAway(new GoAwayInfo(), new FutureCallback()); closeLatch.countDown(); return new StreamFrameListener.Adapter() { @@ -179,12 +184,12 @@ public class GoAwayTest extends AbstractTest } } }; - final AtomicReference goAwayRef = new AtomicReference<>(); + final AtomicReference goAwayRef = new AtomicReference<>(); final CountDownLatch goAwayLatch = new CountDownLatch(1); SessionFrameListener clientSessionFrameListener = new SessionFrameListener.Adapter() { @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { goAwayRef.set(goAwayInfo); goAwayLatch.countDown(); @@ -194,18 +199,18 @@ public class GoAwayTest extends AbstractTest // First stream is processed ok final CountDownLatch reply1Latch = new CountDownLatch(1); - Stream stream1 = session.syn(new SynInfo(true), new StreamFrameListener.Adapter() + session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) { reply1Latch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); Assert.assertTrue(reply1Latch.await(5, TimeUnit.SECONDS)); // Second stream is closed in the middle - Stream stream2 = session.syn(new SynInfo(false), null).get(5, TimeUnit.SECONDS); + Stream stream2 = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null); Assert.assertTrue(closeLatch.await(5, TimeUnit.SECONDS)); // There is a race between the data we want to send, and the client @@ -223,7 +228,7 @@ public class GoAwayTest extends AbstractTest // The last good stream is the second, because it was received by the server Assert.assertTrue(goAwayLatch.await(5, TimeUnit.SECONDS)); - GoAwayInfo goAway = goAwayRef.get(); + GoAwayReceivedInfo goAway = goAwayRef.get(); Assert.assertNotNull(goAway); Assert.assertEquals(stream2.getId(), goAway.getLastStreamId()); } diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/HeadersTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/HeadersTest.java index b93466b96c0..891aeaf1621 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/HeadersTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/HeadersTest.java @@ -29,6 +29,7 @@ import org.eclipse.jetty.spdy.api.Stream; import org.eclipse.jetty.spdy.api.StreamFrameListener; import org.eclipse.jetty.spdy.api.SynInfo; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Fields; import org.junit.Assert; import org.junit.Test; @@ -43,14 +44,14 @@ public class HeadersTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(false)); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); return new StreamFrameListener.Adapter() { @Override public void onHeaders(Stream stream, HeadersInfo headersInfo) { Assert.assertTrue(stream.isHalfClosed()); - stream.headers(new HeadersInfo(new Fields(), true)); + stream.headers(new HeadersInfo(new Fields(), true), new Callback.Adapter()); Assert.assertTrue(stream.isClosed()); } }; @@ -60,7 +61,7 @@ public class HeadersTest extends AbstractTest Session session = startClient(startServer(serverSessionFrameListener), null); final CountDownLatch latch = new CountDownLatch(1); - session.syn(new SynInfo(false), new StreamFrameListener.Adapter() + session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -68,7 +69,7 @@ public class HeadersTest extends AbstractTest Fields headers = new Fields(); headers.put("foo", "bar"); headers.put("baz", "woo"); - stream.headers(new HeadersInfo(headers, true)); + stream.headers(new HeadersInfo(headers, true), new Callback.Adapter()); Assert.assertTrue(stream.isHalfClosed()); } diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/IdleTimeoutTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/IdleTimeoutTest.java index 75db07ba24c..a4e166c8d41 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/IdleTimeoutTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/IdleTimeoutTest.java @@ -23,7 +23,7 @@ import java.net.InetSocketAddress; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import org.eclipse.jetty.spdy.api.GoAwayInfo; +import org.eclipse.jetty.spdy.api.GoAwayReceivedInfo; import org.eclipse.jetty.spdy.api.ReplyInfo; import org.eclipse.jetty.spdy.api.SPDY; import org.eclipse.jetty.spdy.api.Session; @@ -33,6 +33,8 @@ import org.eclipse.jetty.spdy.api.StreamFrameListener; import org.eclipse.jetty.spdy.api.SynInfo; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; import org.eclipse.jetty.spdy.client.SPDYClient; +import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.Fields; import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.junit.Assert; import org.junit.Test; @@ -51,7 +53,7 @@ public class IdleTimeoutTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(true)); + stream.reply(new ReplyInfo(true), new Callback.Adapter()); return null; } }); @@ -61,13 +63,13 @@ public class IdleTimeoutTest extends AbstractTest Session session = startClient(startServer(null), new SessionFrameListener.Adapter() { @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { latch.countDown(); } }); - session.syn(new SynInfo(true), null); + session.syn(new SynInfo(new Fields(), true), null); Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS)); } @@ -83,14 +85,14 @@ public class IdleTimeoutTest extends AbstractTest Session session = startClient(startServer(null), new SessionFrameListener.Adapter() { @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { latch.countDown(); } }); // The SYN is not replied, and the server should idle timeout - session.syn(new SynInfo(true), null); + session.syn(new SynInfo(new Fields(), true), null); Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS)); } @@ -107,7 +109,7 @@ public class IdleTimeoutTest extends AbstractTest try { Thread.sleep(2 * idleTimeout); - stream.reply(new ReplyInfo(true)); + stream.reply(new ReplyInfo(true), new Callback.Adapter()); return null; } catch (InterruptedException x) @@ -123,14 +125,14 @@ public class IdleTimeoutTest extends AbstractTest Session session = startClient(startServer(null), new SessionFrameListener.Adapter() { @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { goAwayLatch.countDown(); } }); final CountDownLatch replyLatch = new CountDownLatch(1); - session.syn(new SynInfo(true), new StreamFrameListener.Adapter() + session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -154,12 +156,12 @@ public class IdleTimeoutTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(true)); + stream.reply(new ReplyInfo(true), new Callback.Adapter()); return null; } @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { latch.countDown(); } @@ -173,7 +175,7 @@ public class IdleTimeoutTest extends AbstractTest client.setIdleTimeout(idleTimeout); Session session = client.connect(address, null).get(5, TimeUnit.SECONDS); - session.syn(new SynInfo(true), null); + session.syn(new SynInfo(new Fields(), true), null); Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS)); } @@ -185,7 +187,7 @@ public class IdleTimeoutTest extends AbstractTest InetSocketAddress address = startServer(new ServerSessionFrameListener.Adapter() { @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { latch.countDown(); } @@ -199,7 +201,7 @@ public class IdleTimeoutTest extends AbstractTest client.setIdleTimeout(idleTimeout); Session session = client.connect(address, null).get(5, TimeUnit.SECONDS); - session.syn(new SynInfo(true), null); + session.syn(new SynInfo(new Fields(), true), null); Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS)); } @@ -213,12 +215,12 @@ public class IdleTimeoutTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(true)); + stream.reply(new ReplyInfo(true), new Callback.Adapter()); return null; } @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { latch.countDown(); } @@ -233,7 +235,7 @@ public class IdleTimeoutTest extends AbstractTest Session session = client.connect(address, null).get(5, TimeUnit.SECONDS); final CountDownLatch replyLatch = new CountDownLatch(1); - session.syn(new SynInfo(true), new StreamFrameListener.Adapter() + session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PingTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PingTest.java index 6d680f3b3c8..6269c85b0b1 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PingTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PingTest.java @@ -24,10 +24,10 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import org.eclipse.jetty.spdy.api.PingInfo; +import org.eclipse.jetty.spdy.api.PingResultInfo; import org.eclipse.jetty.spdy.api.Session; import org.eclipse.jetty.spdy.api.SessionFrameListener; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; -import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Promise; import org.junit.Assert; import org.junit.Test; @@ -37,25 +37,25 @@ public class PingTest extends AbstractTest @Test public void testPingPong() throws Exception { - final AtomicReference ref = new AtomicReference<>(); + final AtomicReference ref = new AtomicReference<>(); final CountDownLatch latch = new CountDownLatch(1); SessionFrameListener clientSessionFrameListener = new SessionFrameListener.Adapter() { @Override - public void onPing(Session session, PingInfo pingInfo) + public void onPing(Session session, PingResultInfo pingInfo) { ref.set(pingInfo); latch.countDown(); } }; Session session = startClient(startServer(null), clientSessionFrameListener); - PingInfo pingInfo = session.ping().get(5, TimeUnit.SECONDS); - Assert.assertEquals(1, pingInfo.getPingId() % 2); + PingResultInfo pingResultInfo = session.ping(new PingInfo(5, TimeUnit.SECONDS)); + Assert.assertEquals(1, pingResultInfo.getPingId() % 2); Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); - PingInfo pongInfo = ref.get(); + PingResultInfo pongInfo = ref.get(); Assert.assertNotNull(pongInfo); - Assert.assertEquals(pingInfo.getPingId(), pongInfo.getPingId()); + Assert.assertEquals(pingResultInfo.getPingId(), pongInfo.getPingId()); } @Test @@ -69,10 +69,10 @@ public class PingTest extends AbstractTest @Override public void onConnect(Session session) { - session.ping(0, TimeUnit.MILLISECONDS, new Promise.Adapter() + session.ping(new PingInfo(), new Promise.Adapter() { @Override - public void succeeded(PingInfo pingInfo) + public void succeeded(PingResultInfo pingInfo) { pingId = pingInfo.getPingId(); } @@ -80,7 +80,7 @@ public class PingTest extends AbstractTest } @Override - public void onPing(Session session, PingInfo pingInfo) + public void onPing(Session session, PingResultInfo pingInfo) { Assert.assertEquals(0, pingInfo.getPingId() % 2); Assert.assertEquals(pingId, pingInfo.getPingId()); diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ProtocolViolationsTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ProtocolViolationsTest.java index 0514c75f074..66720fc65c5 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ProtocolViolationsTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ProtocolViolationsTest.java @@ -29,6 +29,7 @@ import org.eclipse.jetty.io.MappedByteBufferPool; import org.eclipse.jetty.spdy.StandardCompressionFactory; import org.eclipse.jetty.spdy.api.BytesDataInfo; import org.eclipse.jetty.spdy.api.DataInfo; +import org.eclipse.jetty.spdy.api.GoAwayInfo; import org.eclipse.jetty.spdy.api.HeadersInfo; import org.eclipse.jetty.spdy.api.RstInfo; import org.eclipse.jetty.spdy.api.SPDY; @@ -43,6 +44,7 @@ import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; import org.eclipse.jetty.spdy.frames.ControlFrameType; import org.eclipse.jetty.spdy.frames.SynReplyFrame; import org.eclipse.jetty.spdy.generator.Generator; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Fields; import org.junit.Assert; import org.junit.Test; @@ -64,7 +66,7 @@ public class ProtocolViolationsTest extends AbstractTest { try { - stream.data(new StringDataInfo("failure", true)); + stream.data(new StringDataInfo("failure", true), new Callback.Adapter()); return null; } catch (IllegalStateException x) @@ -82,7 +84,7 @@ public class ProtocolViolationsTest extends AbstractTest resetLatch.countDown(); } }); - session.syn(new SynInfo(true), null); + session.syn(new SynInfo(new Fields(), true), null); Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); Assert.assertTrue(resetLatch.await(5, TimeUnit.SECONDS)); } @@ -94,7 +96,7 @@ public class ProtocolViolationsTest extends AbstractTest server.bind(new InetSocketAddress("localhost", 0)); Session session = startClient(new InetSocketAddress("localhost", server.socket().getLocalPort()), null); - session.syn(new SynInfo(true), null); + session.syn(new SynInfo(new Fields(), true), null); SocketChannel channel = server.accept(); ByteBuffer readBuffer = ByteBuffer.allocate(1024); @@ -114,7 +116,7 @@ public class ProtocolViolationsTest extends AbstractTest Assert.assertEquals(ControlFrameType.RST_STREAM.getCode(), readBuffer.getShort(2)); Assert.assertEquals(streamId, readBuffer.getInt(8)); - session.goAway().get(5,TimeUnit.SECONDS); + session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); server.close(); } @@ -123,7 +125,7 @@ public class ProtocolViolationsTest extends AbstractTest public void testSendDataAfterCloseIsIllegal() throws Exception { Session session = startClient(startServer(null), null); - Stream stream = session.syn(new SynInfo(true), null).get(5, TimeUnit.SECONDS); + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), null); stream.data(new StringDataInfo("test", true)); } @@ -131,7 +133,7 @@ public class ProtocolViolationsTest extends AbstractTest public void testSendHeadersAfterCloseIsIllegal() throws Exception { Session session = startClient(startServer(null), null); - Stream stream = session.syn(new SynInfo(true), null).get(5, TimeUnit.SECONDS); + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), null); stream.headers(new HeadersInfo(new Fields(), true)); } @@ -143,7 +145,7 @@ public class ProtocolViolationsTest extends AbstractTest Session session = startClient(new InetSocketAddress("localhost", server.socket().getLocalPort()), null); final CountDownLatch dataLatch = new CountDownLatch(2); - session.syn(new SynInfo(false), new StreamFrameListener.Adapter() + session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter() { @Override public void onData(Stream stream, DataInfo dataInfo) @@ -176,7 +178,7 @@ public class ProtocolViolationsTest extends AbstractTest Assert.assertFalse(dataLatch.await(1, TimeUnit.SECONDS)); - session.goAway().get(5,TimeUnit.SECONDS); + session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); server.close(); } diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PushStreamTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PushStreamTest.java index f1be37feadf..12eeb35086d 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PushStreamTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PushStreamTest.java @@ -30,6 +30,7 @@ import java.util.concurrent.CyclicBarrier; import java.util.concurrent.Exchanger; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -37,7 +38,7 @@ import org.eclipse.jetty.io.MappedByteBufferPool; import org.eclipse.jetty.spdy.StandardCompressionFactory; import org.eclipse.jetty.spdy.api.BytesDataInfo; import org.eclipse.jetty.spdy.api.DataInfo; -import org.eclipse.jetty.spdy.api.GoAwayInfo; +import org.eclipse.jetty.spdy.api.GoAwayReceivedInfo; import org.eclipse.jetty.spdy.api.ReplyInfo; import org.eclipse.jetty.spdy.api.RstInfo; import org.eclipse.jetty.spdy.api.SPDY; @@ -84,8 +85,8 @@ public class PushStreamTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(false)); - stream.syn(new SynInfo(true)); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); + stream.syn(new SynInfo(new Fields(), true), new Promise.Adapter()); return null; } }), new SessionFrameListener.Adapter() @@ -93,13 +94,13 @@ public class PushStreamTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - assertThat("streamId is even",stream.getId() % 2,is(0)); - assertThat("stream is unidirectional",stream.isUnidirectional(),is(true)); - assertThat("stream is closed",stream.isClosed(),is(true)); - assertThat("stream has associated stream",stream.getAssociatedStream(),notNullValue()); + assertThat("streamId is even", stream.getId() % 2, is(0)); + assertThat("stream is unidirectional", stream.isUnidirectional(), is(true)); + assertThat("stream is closed", stream.isClosed(), is(true)); + assertThat("stream has associated stream", stream.getAssociatedStream(), notNullValue()); try { - stream.reply(new ReplyInfo(false)); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); fail("Cannot reply to push streams"); } catch (IllegalStateException x) @@ -112,10 +113,10 @@ public class PushStreamTest extends AbstractTest } }); - Stream stream = clientSession.syn(new SynInfo(true),null).get(); - assertThat("onSyn has been called",pushStreamLatch.await(5,TimeUnit.SECONDS),is(true)); + Stream stream = clientSession.syn(new SynInfo(new Fields(), true), null); + assertThat("onSyn has been called", pushStreamLatch.await(5, TimeUnit.SECONDS), is(true)); Stream pushStream = pushStreamRef.get(); - assertThat("main stream and associated stream are the same",stream,sameInstance(pushStream.getAssociatedStream())); + assertThat("main stream and associated stream are the same", stream, sameInstance(pushStream.getAssociatedStream())); } @Test @@ -134,10 +135,10 @@ public class PushStreamTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(false)); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); try { - replyBarrier.await(5,TimeUnit.SECONDS); + replyBarrier.await(5, TimeUnit.SECONDS); return new StreamFrameListener.Adapter() { @Override @@ -147,14 +148,14 @@ public class PushStreamTest extends AbstractTest { if (dataInfo.isClose()) { - stream.data(new StringDataInfo("close stream",true)); - closeBarrier.await(5,TimeUnit.SECONDS); + stream.data(new StringDataInfo("close stream", true)); + closeBarrier.await(5, TimeUnit.SECONDS); } streamDataSent.countDown(); if (pushStreamDataReceived.getCount() == 2) { - Stream pushStream = stream.syn(new SynInfo(false)).get(); - streamExchanger.exchange(pushStream,5,TimeUnit.SECONDS); + Stream pushStream = stream.syn(new SynInfo(new Fields(), false)); + streamExchanger.exchange(pushStream, 5, TimeUnit.SECONDS); } } catch (Exception e) @@ -171,7 +172,7 @@ public class PushStreamTest extends AbstractTest } } - }),new SessionFrameListener.Adapter() + }), new SessionFrameListener.Adapter() { @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) @@ -183,20 +184,20 @@ public class PushStreamTest extends AbstractTest public void onData(Stream stream, DataInfo dataInfo) { pushStreamDataReceived.countDown(); - super.onData(stream,dataInfo); + super.onData(stream, dataInfo); } }; } }); - Stream stream = clientSession.syn(new SynInfo(false),new StreamFrameListener.Adapter() + Stream stream = clientSession.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) { try { - replyBarrier.await(5,TimeUnit.SECONDS); + replyBarrier.await(5, TimeUnit.SECONDS); } catch (Exception e) { @@ -209,29 +210,29 @@ public class PushStreamTest extends AbstractTest { try { - closeBarrier.await(5,TimeUnit.SECONDS); + closeBarrier.await(5, TimeUnit.SECONDS); } catch (Exception e) { exceptionCountDownLatch.countDown(); } } - }).get(); + }); - replyBarrier.await(5,TimeUnit.SECONDS); - stream.data(new StringDataInfo("client data",false)); - Stream pushStream = streamExchanger.exchange(null,5,TimeUnit.SECONDS); - pushStream.data(new StringDataInfo("first push data frame",false)); + replyBarrier.await(5, TimeUnit.SECONDS); + stream.data(new StringDataInfo("client data", false)); + Stream pushStream = streamExchanger.exchange(null, 5, TimeUnit.SECONDS); + pushStream.data(new StringDataInfo("first push data frame", false)); // nasty, but less complex than using another cyclicBarrier for example while (pushStreamDataReceived.getCount() != 1) Thread.sleep(1); - stream.data(new StringDataInfo("client close",true)); - closeBarrier.await(5,TimeUnit.SECONDS); - assertThat("stream is closed",stream.isClosed(),is(true)); - pushStream.data(new StringDataInfo("second push data frame while associated stream has been closed already",false)); - assertThat("2 pushStream data frames have been received.",pushStreamDataReceived.await(5,TimeUnit.SECONDS),is(true)); - assertThat("2 data frames have been sent",streamDataSent.await(5,TimeUnit.SECONDS),is(true)); - assertThatNoExceptionOccured(exceptionCountDownLatch); + stream.data(new StringDataInfo("client close", true)); + closeBarrier.await(5, TimeUnit.SECONDS); + assertThat("stream is closed", stream.isClosed(), is(true)); + pushStream.data(new StringDataInfo("second push data frame while associated stream has been closed already", false)); + assertThat("2 pushStream data frames have been received.", pushStreamDataReceived.await(5, TimeUnit.SECONDS), is(true)); + assertThat("2 data frames have been sent", streamDataSent.await(5, TimeUnit.SECONDS), is(true)); + assertThatNoExceptionOccurred(exceptionCountDownLatch); } @Test @@ -244,8 +245,8 @@ public class PushStreamTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(true)); - stream.syn(new SynInfo(false),1,TimeUnit.SECONDS,new Promise.Adapter() + stream.reply(new ReplyInfo(true), new Callback.Adapter()); + stream.syn(new SynInfo(1, TimeUnit.SECONDS, new Fields(), false, (byte)0), new Promise.Adapter() { @Override public void failed(Throwable x) @@ -253,12 +254,12 @@ public class PushStreamTest extends AbstractTest pushStreamFailedLatch.countDown(); } }); - return super.onSyn(stream,synInfo); + return super.onSyn(stream, synInfo); } - }),new SessionFrameListener.Adapter()); + }), new SessionFrameListener.Adapter()); - clientSession.syn(new SynInfo(true),null); - assertThat("pushStream syn has failed",pushStreamFailedLatch.await(5,TimeUnit.SECONDS),is(true)); + clientSession.syn(new SynInfo(new Fields(), true), null); + assertThat("pushStream syn has failed", pushStreamFailedLatch.await(5, TimeUnit.SECONDS), is(true)); } @Test @@ -278,11 +279,11 @@ public class PushStreamTest extends AbstractTest { try { - Stream pushStream = stream.syn(new SynInfo(false)).get(); + Stream pushStream = stream.syn(new SynInfo(new Fields(), false)); stream.reply(new ReplyInfo(true)); // wait until stream is closed - streamClosedLatch.await(5,TimeUnit.SECONDS); - pushStream.data(new BytesDataInfo(transferBytes,true)); + streamClosedLatch.await(5, TimeUnit.SECONDS); + pushStream.data(new BytesDataInfo(transferBytes, true), new Callback.Adapter()); return null; } catch (Exception e) @@ -291,7 +292,7 @@ public class PushStreamTest extends AbstractTest throw new IllegalStateException(e); } } - }),new SessionFrameListener.Adapter() + }), new SessionFrameListener.Adapter() { @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) @@ -310,7 +311,7 @@ public class PushStreamTest extends AbstractTest try { receivedBytes.flip(); - exchanger.exchange(receivedBytes.slice(),5,TimeUnit.SECONDS); + exchanger.exchange(receivedBytes.slice(), 5, TimeUnit.SECONDS); } catch (Exception e) { @@ -322,23 +323,23 @@ public class PushStreamTest extends AbstractTest } }); - Stream stream = clientSession.syn(new SynInfo(true),new StreamFrameListener.Adapter() + Stream stream = clientSession.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) { streamClosedLatch.countDown(); - super.onReply(stream,replyInfo); + super.onReply(stream, replyInfo); } - }).get(); + }); - ByteBuffer receivedBytes = exchanger.exchange(null,5,TimeUnit.SECONDS); + ByteBuffer receivedBytes = exchanger.exchange(null, 5, TimeUnit.SECONDS); - assertThat("received byte array is the same as transferred byte array",Arrays.equals(transferBytes,receivedBytes.array()),is(true)); - assertThat("onReply has been called to close the stream",streamClosedLatch.await(5,TimeUnit.SECONDS),is(true)); - assertThat("stream is closed",stream.isClosed(),is(true)); - assertThat("all data has been received",allDataReceived.await(20,TimeUnit.SECONDS),is(true)); - assertThatNoExceptionOccured(exceptionCountDownLatch); + assertThat("received byte array is the same as transferred byte array", Arrays.equals(transferBytes, receivedBytes.array()), is(true)); + assertThat("onReply has been called to close the stream", streamClosedLatch.await(5, TimeUnit.SECONDS), is(true)); + assertThat("stream is closed", stream.isClosed(), is(true)); + assertThat("all data has been received", allDataReceived.await(20, TimeUnit.SECONDS), is(true)); + assertThatNoExceptionOccurred(exceptionCountDownLatch); } private byte[] createHugeByteArray(int sizeInBytes) @@ -364,10 +365,11 @@ public class PushStreamTest extends AbstractTest } private volatile boolean read = true; - private void testNoMoreFramesAreSentOnPushStreamAfterClientResetsThePushStream(final boolean flowControl) throws Exception, IOException, InterruptedException + + private void testNoMoreFramesAreSentOnPushStreamAfterClientResetsThePushStream(final boolean flowControl) throws Exception { final short version = SPDY.V3; - final AtomicBoolean unexpectedExceptionOccured = new AtomicBoolean(false); + final AtomicBoolean unexpectedExceptionOccurred = new AtomicBoolean(false); final CountDownLatch resetReceivedLatch = new CountDownLatch(1); final CountDownLatch allDataFramesReceivedLatch = new CountDownLatch(1); final CountDownLatch goAwayReceivedLatch = new CountDownLatch(1); @@ -385,20 +387,21 @@ public class PushStreamTest extends AbstractTest @Override public void run() { - Stream pushStream=null; + Stream pushStream = null; try { - stream.reply(new ReplyInfo(false)); - pushStream = stream.syn(new SynInfo(false)).get(); - resetReceivedLatch.await(5,TimeUnit.SECONDS); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); + pushStream = stream.syn(new SynInfo(new Fields(), false)); + resetReceivedLatch.await(5, TimeUnit.SECONDS); } - catch (InterruptedException | ExecutionException e) + catch (InterruptedException | ExecutionException | TimeoutException e) { e.printStackTrace(); - unexpectedExceptionOccured.set(true); + unexpectedExceptionOccurred.set(true); } - pushStream.data(new BytesDataInfo(transferBytes,true)); - stream.data(new StringDataInfo("close",true)); + assert pushStream != null; + pushStream.data(new BytesDataInfo(transferBytes, true), new Callback.Adapter()); + stream.data(new StringDataInfo("close", true), new Callback.Adapter()); } }).start(); return null; @@ -411,7 +414,7 @@ public class PushStreamTest extends AbstractTest } @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayInfo) { goAwayReceivedLatch.countDown(); } @@ -420,9 +423,9 @@ public class PushStreamTest extends AbstractTest final SocketChannel channel = SocketChannel.open(serverAddress); final Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory.StandardCompressor()); int streamId = 1; - ByteBuffer writeBuffer = generator.control(new SynStreamFrame(version,(byte)0,streamId,0,(byte)0,(short)0,new Fields())); + ByteBuffer writeBuffer = generator.control(new SynStreamFrame(version, (byte)0, streamId, 0, (byte)0, (short)0, new Fields())); channel.write(writeBuffer); - assertThat("writeBuffer is fully written",writeBuffer.hasRemaining(), is(false)); + assertThat("writeBuffer is fully written", writeBuffer.hasRemaining(), is(false)); final Parser parser = new Parser(new StandardCompressionFactory.StandardDecompressor()); parser.addListener(new Listener.Adapter() @@ -432,9 +435,10 @@ public class PushStreamTest extends AbstractTest @Override public void onControlFrame(ControlFrame frame) { - if(frame instanceof SynStreamFrame){ + if (frame instanceof SynStreamFrame) + { int pushStreamId = ((SynStreamFrame)frame).getStreamId(); - ByteBuffer writeBuffer = generator.control(new RstStreamFrame(version,pushStreamId,StreamStatus.CANCEL_STREAM.getCode(version))); + ByteBuffer writeBuffer = generator.control(new RstStreamFrame(version, pushStreamId, StreamStatus.CANCEL_STREAM.getCode(version))); try { channel.write(writeBuffer); @@ -442,7 +446,7 @@ public class PushStreamTest extends AbstractTest catch (IOException e) { e.printStackTrace(); - unexpectedExceptionOccured.set(true); + unexpectedExceptionOccurred.set(true); } } } @@ -450,15 +454,16 @@ public class PushStreamTest extends AbstractTest @Override public void onDataFrame(DataFrame frame, ByteBuffer data) { - if(frame.getStreamId() == 2) + if (frame.getStreamId() == 2) bytesRead = bytesRead + frame.getLength(); - if(bytesRead == dataSizeInBytes){ + if (bytesRead == dataSizeInBytes) + { allDataFramesReceivedLatch.countDown(); return; } if (flowControl) { - ByteBuffer writeBuffer = generator.control(new WindowUpdateFrame(version,frame.getStreamId(),frame.getLength())); + ByteBuffer writeBuffer = generator.control(new WindowUpdateFrame(version, frame.getStreamId(), frame.getLength())); try { channel.write(writeBuffer); @@ -466,7 +471,7 @@ public class PushStreamTest extends AbstractTest catch (IOException e) { e.printStackTrace(); - unexpectedExceptionOccured.set(true); + unexpectedExceptionOccurred.set(true); } } } @@ -477,7 +482,7 @@ public class PushStreamTest extends AbstractTest @Override public void run() { - ByteBuffer readBuffer = ByteBuffer.allocate(dataSizeInBytes*2); + ByteBuffer readBuffer = ByteBuffer.allocate(dataSizeInBytes * 2); while (read) { try @@ -487,7 +492,7 @@ public class PushStreamTest extends AbstractTest catch (IOException e) { e.printStackTrace(); - unexpectedExceptionOccured.set(true); + unexpectedExceptionOccurred.set(true); } readBuffer.flip(); parser.parse(readBuffer); @@ -499,15 +504,15 @@ public class PushStreamTest extends AbstractTest reader.start(); read = false; - assertThat("no unexpected exceptions occured", unexpectedExceptionOccured.get(), is(false)); - assertThat("not all dataframes have been received as the pushstream has been reset by the client.",allDataFramesReceivedLatch.await(streamId,TimeUnit.SECONDS),is(false)); + assertThat("no unexpected exceptions occurred", unexpectedExceptionOccurred.get(), is(false)); + assertThat("not all dataframes have been received as the pushstream has been reset by the client.", allDataFramesReceivedLatch.await(streamId, TimeUnit.SECONDS), is(false)); ByteBuffer buffer = generator.control(new GoAwayFrame(version, streamId, SessionStatus.OK.getCode())); channel.write(buffer); Assert.assertThat(buffer.hasRemaining(), is(false)); - assertThat("GoAway frame is received by server", goAwayReceivedLatch.await(5,TimeUnit.SECONDS), is(true)); + assertThat("GoAway frame is received by server", goAwayReceivedLatch.await(5, TimeUnit.SECONDS), is(true)); channel.shutdownOutput(); channel.close(); } @@ -522,42 +527,42 @@ public class PushStreamTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.syn(new SynInfo(false)); + stream.syn(new SynInfo(new Fields(), false), new Promise.Adapter()); return null; } - }),new SessionFrameListener.Adapter() + }), new SessionFrameListener.Adapter() { @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { assertStreamIdIsEven(stream); pushStreamIdIsEvenLatch.countDown(); - return super.onSyn(stream,synInfo); + return super.onSyn(stream, synInfo); } }); - Stream stream = clientSession.syn(new SynInfo(false),null).get(); - Stream stream2 = clientSession.syn(new SynInfo(false),null).get(); - Stream stream3 = clientSession.syn(new SynInfo(false),null).get(); + Stream stream = clientSession.syn(new SynInfo(new Fields(), false), null); + Stream stream2 = clientSession.syn(new SynInfo(new Fields(), false), null); + Stream stream3 = clientSession.syn(new SynInfo(new Fields(), false), null); assertStreamIdIsOdd(stream); assertStreamIdIsOdd(stream2); assertStreamIdIsOdd(stream3); - assertThat("all pushStreams had even ids",pushStreamIdIsEvenLatch.await(5,TimeUnit.SECONDS),is(true)); + assertThat("all pushStreams had even ids", pushStreamIdIsEvenLatch.await(5, TimeUnit.SECONDS), is(true)); } private void assertStreamIdIsEven(Stream stream) { - assertThat("streamId is odd",stream.getId() % 2,is(0)); + assertThat("streamId is odd", stream.getId() % 2, is(0)); } private void assertStreamIdIsOdd(Stream stream) { - assertThat("streamId is odd",stream.getId() % 2,is(1)); + assertThat("streamId is odd", stream.getId() % 2, is(1)); } - private void assertThatNoExceptionOccured(final CountDownLatch exceptionCountDownLatch) throws InterruptedException + private void assertThatNoExceptionOccurred(final CountDownLatch exceptionCountDownLatch) throws InterruptedException { - assertThat("No exception occured",exceptionCountDownLatch.await(1,TimeUnit.SECONDS),is(false)); + assertThat("No exception occurred", exceptionCountDownLatch.await(1, TimeUnit.SECONDS), is(false)); } } diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ResetStreamTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ResetStreamTest.java index db801d568bc..c25c6292a2c 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ResetStreamTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ResetStreamTest.java @@ -33,6 +33,8 @@ import org.eclipse.jetty.spdy.api.StringDataInfo; import org.eclipse.jetty.spdy.api.SynInfo; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.Fields; +import org.eclipse.jetty.util.FutureCallback; import org.junit.Test; import static org.hamcrest.Matchers.is; @@ -46,12 +48,12 @@ public class ResetStreamTest extends AbstractTest @Test public void testResetStreamIsRemoved() throws Exception { - Session session = startClient(startServer(new ServerSessionFrameListener.Adapter()/*TODO, true*/),null); + Session session = startClient(startServer(new ServerSessionFrameListener.Adapter()/*TODO, true*/), null); - Stream stream = session.syn(new SynInfo(false),null).get(5,TimeUnit.SECONDS); - session.rst(new RstInfo(stream.getId(),StreamStatus.CANCEL_STREAM)).get(5,TimeUnit.SECONDS); + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null); + session.rst(new RstInfo(5, TimeUnit.SECONDS, stream.getId(), StreamStatus.CANCEL_STREAM)); - assertEquals("session expected to contain 0 streams",0,session.getStreams().size()); + assertEquals("session expected to contain 0 streams", 0, session.getStreams().size()); } @Test @@ -67,11 +69,11 @@ public class ResetStreamTest extends AbstractTest { Session serverSession = stream.getSession(); serverSessionRef.set(serverSession); - serverSession.rst(new RstInfo(stream.getId(),StreamStatus.REFUSED_STREAM)); + serverSession.rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new FutureCallback()); synLatch.countDown(); return null; } - }),new SessionFrameListener.Adapter() + }), new SessionFrameListener.Adapter() { @Override public void onRst(Session session, RstInfo rstInfo) @@ -80,17 +82,17 @@ public class ResetStreamTest extends AbstractTest } }); - Stream stream = clientSession.syn(new SynInfo(false),null).get(5,TimeUnit.SECONDS); + Stream stream = clientSession.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null); - assertTrue("syncLatch didn't count down",synLatch.await(5,TimeUnit.SECONDS)); + assertTrue("syncLatch didn't count down", synLatch.await(5, TimeUnit.SECONDS)); Session serverSession = serverSessionRef.get(); - assertEquals("serverSession expected to contain 0 streams",0,serverSession.getStreams().size()); + assertEquals("serverSession expected to contain 0 streams", 0, serverSession.getStreams().size()); - assertTrue("rstLatch didn't count down",rstLatch.await(5,TimeUnit.SECONDS)); + assertTrue("rstLatch didn't count down", rstLatch.await(5, TimeUnit.SECONDS)); // Need to sleep a while to give the chance to the implementation to remove the stream TimeUnit.SECONDS.sleep(1); - assertTrue("stream is expected to be reset",stream.isReset()); - assertEquals("clientSession expected to contain 0 streams",0,clientSession.getStreams().size()); + assertTrue("stream is expected to be reset", stream.isReset()); + assertEquals("clientSession expected to contain 0 streams", 0, clientSession.getStreams().size()); } @Test @@ -107,8 +109,8 @@ public class ResetStreamTest extends AbstractTest try { // Refuse the stream, we must ignore data frames - assertTrue(synLatch.await(5,TimeUnit.SECONDS)); - stream.getSession().rst(new RstInfo(stream.getId(),StreamStatus.REFUSED_STREAM)); + assertTrue(synLatch.await(5, TimeUnit.SECONDS)); + stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new FutureCallback()); return new StreamFrameListener.Adapter() { @Override @@ -124,7 +126,7 @@ public class ResetStreamTest extends AbstractTest return null; } } - }),new SessionFrameListener.Adapter() + }), new SessionFrameListener.Adapter() { @Override public void onRst(Session session, RstInfo rstInfo) @@ -133,8 +135,8 @@ public class ResetStreamTest extends AbstractTest } }); - Stream stream = session.syn(new SynInfo(false),null).get(5,TimeUnit.SECONDS); - stream.data(new StringDataInfo("data",true),5,TimeUnit.SECONDS,new Callback.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null); + stream.data(new StringDataInfo(5, TimeUnit.SECONDS, "data", true), new Callback.Adapter() { @Override public void succeeded() @@ -143,9 +145,9 @@ public class ResetStreamTest extends AbstractTest } }); - assertTrue("rstLatch didn't count down",rstLatch.await(5,TimeUnit.SECONDS)); - assertTrue("stream is expected to be reset",stream.isReset()); - assertFalse("dataLatch shouln't be count down",dataLatch.await(1,TimeUnit.SECONDS)); + assertTrue("rstLatch didn't count down", rstLatch.await(5, TimeUnit.SECONDS)); + assertTrue("stream is expected to be reset", stream.isReset()); + assertFalse("dataLatch shouldn't be count down", dataLatch.await(1, TimeUnit.SECONDS)); } @Test @@ -167,11 +169,11 @@ public class ResetStreamTest extends AbstractTest public void onData(Stream stream, DataInfo dataInfo) { dataLatch.countDown(); - stream.getSession().rst(new RstInfo(stream.getId(),StreamStatus.REFUSED_STREAM)); + stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new FutureCallback()); } }; } - }),new SessionFrameListener.Adapter() + }), new SessionFrameListener.Adapter() { @Override public void onRst(Session session, RstInfo rstInfo) @@ -180,11 +182,11 @@ public class ResetStreamTest extends AbstractTest } }); - Stream stream = session.syn(new SynInfo(false),null).get(5,TimeUnit.SECONDS); - assertThat("syn is received by server", synLatch.await(5,TimeUnit.SECONDS),is(true)); - stream.data(new StringDataInfo("data",false),5,TimeUnit.SECONDS,new Callback.Adapter()); - assertThat("stream is reset",rstLatch.await(5,TimeUnit.SECONDS),is(true)); - stream.data(new StringDataInfo("2nd dataframe",false),5L,TimeUnit.SECONDS,new Callback.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null); + assertThat("syn is received by server", synLatch.await(5, TimeUnit.SECONDS), is(true)); + stream.data(new StringDataInfo(5, TimeUnit.SECONDS, "data", false), new Callback.Adapter()); + assertThat("stream is reset", rstLatch.await(5, TimeUnit.SECONDS), is(true)); + stream.data(new StringDataInfo(5, TimeUnit.SECONDS, "2nd dataframe", false), new Callback.Adapter() { @Override public void failed(Throwable x) @@ -193,8 +195,8 @@ public class ResetStreamTest extends AbstractTest } }); - assertThat("2nd data call failed",failLatch.await(5,TimeUnit.SECONDS),is(true)); - assertThat("stream is reset",stream.isReset(),is(true)); + assertThat("2nd data call failed", failLatch.await(5, TimeUnit.SECONDS), is(true)); + assertThat("stream is reset", stream.isReset(), is(true)); } // TODO: If server already received 2nd dataframe after it rst, it should ignore it. Not easy to do. diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYClientFactoryTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYClientFactoryTest.java index 94a716623e6..5cf457a6777 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYClientFactoryTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYClientFactoryTest.java @@ -23,6 +23,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import org.eclipse.jetty.spdy.api.GoAwayInfo; +import org.eclipse.jetty.spdy.api.GoAwayReceivedInfo; import org.eclipse.jetty.spdy.api.Session; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; import org.junit.Assert; @@ -37,7 +38,7 @@ public class SPDYClientFactoryTest extends AbstractTest startClient(startServer(new ServerSessionFrameListener.Adapter() { @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayReceivedInfo) { latch.countDown(); } @@ -58,7 +59,7 @@ public class SPDYClientFactoryTest extends AbstractTest { Session session = startClient(startServer(null), null); - session.goAway().get(5, TimeUnit.SECONDS); + session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); // Sleep a while to allow the factory to remove the session // since it is done asynchronously by the selector thread diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYServerConnectorTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYServerConnectorTest.java index 9f3dd15fe9a..c301ea14131 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYServerConnectorTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYServerConnectorTest.java @@ -23,6 +23,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import org.eclipse.jetty.spdy.api.GoAwayInfo; +import org.eclipse.jetty.spdy.api.GoAwayReceivedInfo; import org.eclipse.jetty.spdy.api.Session; import org.eclipse.jetty.spdy.api.SessionFrameListener; import org.junit.Assert; @@ -37,7 +38,7 @@ public class SPDYServerConnectorTest extends AbstractTest startClient(startServer(null), new SessionFrameListener.Adapter() { @Override - public void onGoAway(Session session, GoAwayInfo goAwayInfo) + public void onGoAway(Session session, GoAwayReceivedInfo goAwayReceivedInfo) { latch.countDown(); } @@ -58,7 +59,7 @@ public class SPDYServerConnectorTest extends AbstractTest { Session session = startClient(startServer(null), null); - session.goAway().get(5, TimeUnit.SECONDS); + session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); // Sleep a while to allow the connector to remove the session // since it is done asynchronously by the selector thread diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SSLEngineLeakTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SSLEngineLeakTest.java index 319b3c3a8e6..05e51a21d6f 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SSLEngineLeakTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SSLEngineLeakTest.java @@ -25,6 +25,7 @@ import java.util.concurrent.TimeUnit; import org.eclipse.jetty.npn.NextProtoNego; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.spdy.api.GoAwayInfo; import org.eclipse.jetty.spdy.api.Session; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; import org.eclipse.jetty.spdy.client.SPDYClient; @@ -83,6 +84,6 @@ public class SSLEngineLeakTest extends AbstractTest private void avoidStackLocalVariables() throws Exception { Session session = startClient(startServer(null), null); - session.goAway().get(5, TimeUnit.SECONDS); + session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS)); } } diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SettingsTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SettingsTest.java index e4711f3022b..5401e2fd2ea 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SettingsTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SettingsTest.java @@ -31,6 +31,7 @@ import org.eclipse.jetty.spdy.api.SessionFrameListener; import org.eclipse.jetty.spdy.api.Settings; import org.eclipse.jetty.spdy.api.SettingsInfo; import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener; +import org.eclipse.jetty.util.FutureCallback; import org.junit.Assert; import org.junit.Test; @@ -106,7 +107,7 @@ public class SettingsTest extends AbstractTest @Override public void onConnect(Session session) { - session.settings(serverSettingsInfo); + session.settings(serverSettingsInfo, new FutureCallback()); } }; diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynDataReplyDataLoadTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynDataReplyDataLoadTest.java index e1429aa2281..ac9aa5efdbb 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynDataReplyDataLoadTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynDataReplyDataLoadTest.java @@ -57,14 +57,14 @@ public class SynDataReplyDataLoadTest extends AbstractTest @Override public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { - stream.reply(new ReplyInfo(synInfo.getHeaders(), false)); + stream.reply(new ReplyInfo(synInfo.getHeaders(), false), new Callback.Adapter()); return new StreamFrameListener.Adapter() { @Override public void onData(Stream stream, DataInfo dataInfo) { ByteBuffer buffer = dataInfo.asByteBuffer(true); - stream.data(new ByteBufferDataInfo(buffer, dataInfo.isClose())); + stream.data(new ByteBufferDataInfo(buffer, dataInfo.isClose()), new Callback.Adapter()); } }; } @@ -173,12 +173,13 @@ public class SynDataReplyDataLoadTest extends AbstractTest latch.countDown(); } } - }, 0, TimeUnit.SECONDS, new Promise.Adapter() - { + }, new Promise.Adapter() + { @Override public void succeeded(Stream stream) { - stream.data(new StringDataInfo("data_" + stream.getId(), true), 0, TimeUnit.SECONDS, new Callback.Adapter()); + stream.data(new StringDataInfo("data_" + stream.getId(), true), + new Callback.Adapter()); } }); } @@ -195,7 +196,8 @@ public class SynDataReplyDataLoadTest extends AbstractTest final AtomicInteger count = new AtomicInteger(2); final int index = i; counter.put(index, index); - Stream stream = session.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), + new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -216,8 +218,8 @@ public class SynDataReplyDataLoadTest extends AbstractTest latch.countDown(); } } - }).get(5, TimeUnit.SECONDS); - stream.data(new StringDataInfo("data_" + stream.getId(), true)).get(5, TimeUnit.SECONDS); + }); + stream.data(new StringDataInfo(5, TimeUnit.SECONDS, "data_" + stream.getId(), true)); } Assert.assertTrue(latch.await(iterations, TimeUnit.SECONDS)); Assert.assertTrue(counter.toString(), counter.isEmpty()); diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynReplyTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynReplyTest.java index cdb4206631d..4c1c934c32e 100644 --- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynReplyTest.java +++ b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynReplyTest.java @@ -64,7 +64,7 @@ public class SynReplyTest extends AbstractTest public StreamFrameListener onSyn(Stream stream, SynInfo synInfo) { Assert.assertTrue(stream.isHalfClosed()); - stream.reply(new ReplyInfo(new Fields(), true)); + stream.reply(new ReplyInfo(new Fields(), true), new Callback.Adapter()); synLatch.countDown(); return null; } @@ -94,7 +94,8 @@ public class SynReplyTest extends AbstractTest }); final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), + new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -102,7 +103,7 @@ public class SynReplyTest extends AbstractTest Assert.assertTrue(stream.isClosed()); replyLatch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); Assert.assertTrue(synLatch.await(5, TimeUnit.SECONDS)); @@ -147,7 +148,7 @@ public class SynReplyTest extends AbstractTest Assert.assertTrue(stream.isHalfClosed()); Assert.assertFalse(stream.isClosed()); - stream.reply(new ReplyInfo(true)); + stream.reply(new ReplyInfo(true), new Callback.Adapter()); Assert.assertTrue(stream.isClosed()); dataLatch.countDown(); } @@ -168,14 +169,15 @@ public class SynReplyTest extends AbstractTest }); final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(false), new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), + new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) { replyLatch.countDown(); } - }).get(5, TimeUnit.SECONDS); + }); stream.data(new BytesDataInfo(dataBytes, true)); Assert.assertTrue(synLatch.await(5, TimeUnit.SECONDS)); @@ -199,13 +201,13 @@ public class SynReplyTest extends AbstractTest { Assert.assertTrue(stream.isHalfClosed()); - stream.reply(new ReplyInfo(false)); - stream.data(new StringDataInfo(data1, false), 5, TimeUnit.SECONDS, new Callback.Adapter() + stream.reply(new ReplyInfo(false), new Callback.Adapter()); + stream.data(new StringDataInfo(5, TimeUnit.SECONDS, data1, false), new Callback.Adapter() { @Override public void succeeded() { - stream.data(new StringDataInfo(data2, true)); + stream.data(new StringDataInfo(data2, true), new Adapter()); } }); @@ -216,7 +218,7 @@ public class SynReplyTest extends AbstractTest final CountDownLatch replyLatch = new CountDownLatch(1); final CountDownLatch dataLatch1 = new CountDownLatch(1); final CountDownLatch dataLatch2 = new CountDownLatch(1); - session.syn(new SynInfo(true), new StreamFrameListener.Adapter() + session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter() { private AtomicInteger dataCount = new AtomicInteger(); @@ -264,7 +266,7 @@ public class SynReplyTest extends AbstractTest @Override public void onConnect(Session session) { - session.syn(new SynInfo(false), new StreamFrameListener.Adapter() + session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter() { @Override public void onReply(Stream stream, ReplyInfo replyInfo) @@ -279,12 +281,12 @@ public class SynReplyTest extends AbstractTest Assert.assertEquals(clientData, data); clientDataLatch.countDown(); } - }, 0, TimeUnit.MILLISECONDS, new Promise.Adapter() + }, new Promise.Adapter() { @Override public void succeeded(Stream stream) { - stream.data(new StringDataInfo(serverData, true)); + stream.data(new StringDataInfo(serverData, true), new Callback.Adapter()); } }); } @@ -299,8 +301,8 @@ public class SynReplyTest extends AbstractTest { Assert.assertEquals(0, stream.getId() % 2); - stream.reply(new ReplyInfo(false)); - stream.data(new StringDataInfo(clientData, true)); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); + stream.data(new StringDataInfo(clientData, true), new Callback.Adapter()); synLatch.countDown(); return new StreamFrameListener.Adapter() @@ -336,8 +338,8 @@ public class SynReplyTest extends AbstractTest { Assert.assertTrue(stream.isHalfClosed()); - stream.reply(new ReplyInfo(false)); - stream.data(new StringDataInfo(data, true)); + stream.reply(new ReplyInfo(false), new Callback.Adapter()); + stream.data(new StringDataInfo(data, true), new Callback.Adapter()); return null; } @@ -364,8 +366,8 @@ public class SynReplyTest extends AbstractTest dataLatch.countDown(); } }; - session.syn(new SynInfo(true), clientStreamFrameListener); - session.syn(new SynInfo(true), clientStreamFrameListener); + session.syn(new SynInfo(new Fields(), true), clientStreamFrameListener); + session.syn(new SynInfo(new Fields(), true), clientStreamFrameListener); Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));