package com.koushikdutta.async.http.server; import java.util.regex.Matcher; import com.koushikdutta.async.AsyncSocket; import com.koushikdutta.async.DataEmitter; import com.koushikdutta.async.FilteredDataEmitter; import com.koushikdutta.async.LineEmitter; import com.koushikdutta.async.LineEmitter.StringCallback; import com.koushikdutta.async.callback.CompletedCallback; import com.koushikdutta.async.callback.DataCallback; import com.koushikdutta.async.http.AsyncHttpRequestBody; import com.koushikdutta.async.http.HttpUtil; import com.koushikdutta.async.http.libcore.RawHeaders; import com.koushikdutta.async.http.libcore.RequestHeaders; public abstract class AsyncHttpServerRequestImpl extends FilteredDataEmitter implements AsyncHttpServerRequest, CompletedCallback { private RawHeaders mRawHeaders = new RawHeaders(); AsyncSocket mSocket; Matcher mMatcher; private CompletedCallback mReporter = new CompletedCallback() { @Override public void onCompleted(Exception error) { AsyncHttpServerRequestImpl.this.onCompleted(error); } }; @Override public void onCompleted(Exception e) { // if (mBody != null) // mBody.onCompleted(e); report(e); } abstract protected void onHeadersReceived(); protected void onNotHttp() { System.out.println("not http: " + mRawHeaders.getStatusLine()); System.out.println("not http: " + mRawHeaders.getStatusLine().length()); } StringCallback mHeaderCallback = new StringCallback() { @Override public void onStringAvailable(String s) { try { if (mRawHeaders.getStatusLine() == null) { mRawHeaders.setStatusLine(s); if (!mRawHeaders.getStatusLine().contains("HTTP/")) { onNotHttp(); mSocket.setDataCallback(null); } } else if (!"\r".equals(s)){ mRawHeaders.addLine(s); } else { DataEmitter emitter = HttpUtil.getBodyDecoder(mSocket, mRawHeaders, true); // emitter.setEndCallback(mReporter); mBody = HttpUtil.getBody(emitter, mReporter, mRawHeaders); mBody.parse(emitter, mReporter); mHeaders = new RequestHeaders(null, mRawHeaders); onHeadersReceived(); } } catch (Exception ex) { onCompleted(ex); } } }; RawHeaders getRawHeaders() { return mRawHeaders; } String method; @Override public String getMethod() { return method; } void setSocket(AsyncSocket socket) { mSocket = socket; LineEmitter liner = new LineEmitter(); mSocket.setDataCallback(liner); liner.setLineCallback(mHeaderCallback); } @Override public AsyncSocket getSocket() { return mSocket; } private RequestHeaders mHeaders; @Override public RequestHeaders getHeaders() { return mHeaders; } @Override public void setDataCallback(DataCallback callback) { mSocket.setDataCallback(callback); } @Override public DataCallback getDataCallback() { return mSocket.getDataCallback(); } @Override public boolean isChunked() { return mSocket.isChunked(); } @Override public Matcher getMatcher() { return mMatcher; } AsyncHttpRequestBody mBody; @Override public AsyncHttpRequestBody getBody() { return mBody; } @Override public void pause() { mSocket.pause(); } @Override public void resume() { mSocket.resume(); } @Override public boolean isPaused() { return mSocket.isPaused(); } }