package com.koushikdutta.async.http; import com.koushikdutta.async.AsyncSocket; import com.koushikdutta.async.DataEmitter; import com.koushikdutta.async.DataSink; import com.koushikdutta.async.callback.CompletedCallback; import com.koushikdutta.async.callback.ConnectCallback; import com.koushikdutta.async.future.Cancellable; import com.koushikdutta.async.util.UntypedHashtable; /** * AsyncHttpClientMiddleware is used by AsyncHttpClient to * inspect, manipulate, and handle http requests. */ public interface AsyncHttpClientMiddleware { public interface ResponseHead { public AsyncSocket socket(); public String protocol(); public String message(); public int code(); public ResponseHead protocol(String protocol); public ResponseHead message(String message); public ResponseHead code(int code); public Headers headers(); public ResponseHead headers(Headers headers); public DataSink sink(); public ResponseHead sink(DataSink sink); public DataEmitter emitter(); public ResponseHead emitter(DataEmitter emitter); } public static class OnRequestData { public UntypedHashtable state = new UntypedHashtable(); public AsyncHttpRequest request; } public static class GetSocketData extends OnRequestData { public ConnectCallback connectCallback; public Cancellable socketCancellable; public String protocol; } public static class OnExchangeHeaderData extends GetSocketData { public AsyncSocket socket; public ResponseHead response; public CompletedCallback sendHeadersCallback; public CompletedCallback receiveHeadersCallback; } public static class OnRequestSentData extends OnExchangeHeaderData { } public static class OnHeadersReceivedDataOnRequestSentData extends OnRequestSentData { } public static class OnBodyDataOnRequestSentData extends OnHeadersReceivedDataOnRequestSentData { public DataEmitter bodyEmitter; } public static class OnResponseCompleteDataOnRequestSentData extends OnBodyDataOnRequestSentData { public Exception exception; } /** * Called immediately upon request execution * @param data */ public void onRequest(OnRequestData data); /** * Called to retrieve the socket that will fulfill this request * @param data * @return */ public Cancellable getSocket(GetSocketData data); /** * Called before when the headers are sent and received via the socket. * Implementers return true to denote they will manage header exchange. * @param data * @return */ public boolean exchangeHeaders(OnExchangeHeaderData data); /** * Called once the headers and any optional request body has * been sent * @param data */ public void onRequestSent(OnRequestSentData data); /** * Called once the headers have been received via the socket * @param data */ public void onHeadersReceived(OnHeadersReceivedDataOnRequestSentData data); /** * Called before the body is decoded * @param data */ public void onBodyDecoder(OnBodyDataOnRequestSentData data); /** * Called once the request is complete and response has been received, * or if an error occurred * @param data */ public void onResponseComplete(OnResponseCompleteDataOnRequestSentData data); }