module hunt.http.client.HttpClientConnection;

import hunt.http.client.ClientHttpHandler;
import hunt.http.client.Http2ClientConnection;

import hunt.http.codec.http.frame.SettingsFrame;
import hunt.http.codec.http.model.MetaData;
import hunt.http.codec.http.stream.HttpConnection;
import hunt.http.codec.http.stream.HttpOutputStream;
import hunt.http.codec.websocket.model.IncomingFrames;
import hunt.http.codec.websocket.stream.WebSocketConnection;
import hunt.http.codec.websocket.stream.WebSocketPolicy;
import hunt.util.concurrent.Promise;

import hunt.container.ByteBuffer;
import hunt.container.Collection;

alias Request = HttpRequest;
alias Response = HttpResponse;

interface HttpClientConnection : HttpConnection {

    void send(Request request, Promise!(HttpOutputStream) promise, ClientHttpHandler handler);

    void send(Request request, ClientHttpHandler handler);

    void send(Request request, ByteBuffer buffer, ClientHttpHandler handler);

    void send(Request request, ByteBuffer[] buffers, ClientHttpHandler handler);

    // void send(Request request, Collection!ByteBuffer buffers, ClientHttpHandler handler);

    HttpOutputStream sendRequestWithContinuation(Request request, ClientHttpHandler handler);

    HttpOutputStream getHttpOutputStream(Request request, ClientHttpHandler handler);

    void upgradeHttp2(Request request, SettingsFrame settings, Promise!(HttpClientConnection) promise,
                      ClientHttpHandler upgradeHandler, ClientHttpHandler http2ResponseHandler);

    void upgradeWebSocket(Request request, WebSocketPolicy policy, Promise!(WebSocketConnection) promise,
                          ClientHttpHandler upgradeHandler, IncomingFrames incomingFrames);
}