package com.webpieces.http2engine.impl.client; import java.nio.ByteBuffer; import java.util.concurrent.CompletableFuture; import org.webpieces.data.api.DataWrapper; import com.webpieces.hpack.api.dto.Http2Push; import com.webpieces.http2engine.api.client.ClientEngineListener; import com.webpieces.http2engine.api.client.Http2ResponseListener; import com.webpieces.http2engine.api.client.PushPromiseListener; import com.webpieces.http2engine.impl.shared.EngineResultListener; import com.webpieces.http2engine.impl.shared.Stream; import com.webpieces.http2parser.api.Http2Exception; import com.webpieces.http2parser.api.dto.GoAwayFrame; import com.webpieces.http2parser.api.dto.lib.Http2Frame; import com.webpieces.http2parser.api.dto.lib.Http2Msg; import com.webpieces.http2parser.api.dto.lib.PartialStream; public class Level8NotifyListeners implements EngineResultListener { private ClientEngineListener listener; public Level8NotifyListeners(ClientEngineListener socketListener) { this.listener = socketListener; } public void sendPreface(DataWrapper prefaceData) { ByteBuffer buffer = ByteBuffer.wrap(prefaceData.createByteArray()); sendToSocket(buffer); } @Override public CompletableFuture<Void> sendToSocket(ByteBuffer buffer) { return listener.sendToSocket(buffer); } @Override public CompletableFuture<Void> sendControlFrameToClient(Http2Msg msg) { CompletableFuture<Void> future = new CompletableFuture<Void>(); try { if(msg instanceof GoAwayFrame) { listener.sendControlFrameToClient((Http2Frame) msg); } else throw new UnsupportedOperationException("not done yet. frame="+msg); future.complete(null); } catch(Throwable e) { future.completeExceptionally(new RuntimeException(e)); } return future; } public void farEndClosed() { this.listener.engineClosedByFarEnd(); } @Override public void closeSocket(Http2Exception reason) { listener.closeSocket(reason); } @Override public CompletableFuture<Void> sendPieceToApp(Stream stream, PartialStream payload) { if(payload.getStreamId() % 2 == 1 && !(payload instanceof Http2Push)) { Http2ResponseListener listener = stream.getResponseListener(); return listener.incomingPartialResponse(payload); } else { PushPromiseListener listener = stream.getPushListener(); return listener.incomingPushPromise(payload); } } }