package test.codec.http2;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import com.firefly.codec.http2.frame.DataFrame;
import com.firefly.codec.http2.frame.HeadersFrame;
import com.firefly.codec.http2.frame.SettingsFrame;
import com.firefly.codec.http2.model.HttpFields;
import com.firefly.codec.http2.model.HttpURI;
import com.firefly.codec.http2.model.HttpVersion;
import com.firefly.codec.http2.model.MetaData;
import com.firefly.codec.http2.stream.HTTP2Configuration;
import com.firefly.codec.http2.stream.Session;
import com.firefly.codec.http2.stream.Stream;
import com.firefly.codec.http2.stream.Stream.Listener;
import com.firefly.server.http2.HTTP2Server;
import com.firefly.server.http2.ServerHTTPHandler;
import com.firefly.server.http2.ServerSessionListener;
import com.firefly.utils.concurrent.Callback;
import com.firefly.utils.io.BufferUtils;
public class HTTP2ServerH2cDemo {
public static void main(String[] args) {
final HTTP2Configuration http2Configuration = new HTTP2Configuration();
http2Configuration.setFlowControlStrategy("simple");
http2Configuration.getTcpConfiguration().setTimeout(60 * 1000);
final Map<Integer, Integer> settings = new HashMap<>();
settings.put(SettingsFrame.HEADER_TABLE_SIZE, http2Configuration.getMaxDynamicTableSize());
settings.put(SettingsFrame.INITIAL_WINDOW_SIZE, http2Configuration.getInitialStreamSendWindow());
HTTP2Server server = new HTTP2Server("127.0.0.1", 6677, http2Configuration,
new ServerSessionListener.Adapter() {
@Override
public Map<Integer, Integer> onPreface(Session session) {
System.out.println("session preface: " + session);
return settings;
}
@Override
public Listener onNewStream(Stream stream, HeadersFrame frame) {
System.out.println("session new stream, " + frame.getMetaData() + "|" + stream);
MetaData metaData = frame.getMetaData();
if (metaData.isRequest()) {
final MetaData.Request request = (MetaData.Request) metaData;
HttpURI uri = request.getURI();
if (uri.getPath().equals("/index")) {
MetaData.Response response = new MetaData.Response(HttpVersion.HTTP_2, 200,
new HttpFields());
HeadersFrame responseFrame = new HeadersFrame(stream.getId(), response, null, true);
stream.headers(responseFrame, new Callback() {
@Override
public void succeeded() {
System.out.println("response success");
}
@Override
public void failed(Throwable x) {
x.printStackTrace();
}
});
System.out.println("server response");
} else if (uri.getPath().equals("/data")) {
}
}
return new Listener.Adapter() {
@Override
public void onHeaders(Stream stream, HeadersFrame frame) {
System.out.println("stream on headers " + frame.getMetaData() + "|" + stream);
}
@Override
public void onData(Stream stream, DataFrame frame, Callback callback) {
System.out.println("session on data, " + frame + "|"
+ BufferUtils.toString(frame.getData(), StandardCharsets.UTF_8));
if(frame.isEndStream()) {
MetaData.Response response = new MetaData.Response(HttpVersion.HTTP_2, 200,
new HttpFields());
HeadersFrame responseFrame = new HeadersFrame(stream.getId(), response, null, true);
stream.headers(responseFrame, new Callback() {
@Override
public void succeeded() {
System.out.println("response data success");
}
@Override
public void failed(Throwable x) {
x.printStackTrace();
}
});
}
callback.succeeded();
}
};
}
@Override
public void onAccept(Session session) {
System.out.println("accept a new session " + session);
}
}, new ServerHTTPHandler.Adapter());
server.start();
}
}