private static void HandleError(Exception e, HttpReaderState httpReaderState) { if (httpReaderState != null) { if (httpReaderState.HttpInboundSocketPipe != null) { httpReaderState.HttpInboundSocketPipe.HandleError(e); } httpReaderState.Dispose(); } }
private static void BeginReceive(HttpReaderState httpReaderState) { try { if (httpReaderState != null && httpReaderState.Socket == null) { httpReaderState.Dispose(); return; } httpReaderState.Socket.BeginReceive(httpReaderState.ReceiveBuffer, 0, httpReaderState.ReceiveBuffer.Length, SocketFlags.None, ascDataReceived, httpReaderState); } catch (Exception e) { HandleError(e, httpReaderState); } }
private static void OnDataReceivedCallback(IAsyncResult asyn) { HttpReaderState httpReaderState = asyn.AsyncState as HttpReaderState; try { if (httpReaderState.Socket != null && httpReaderState.Socket.Connected && OnData(httpReaderState, httpReaderState.ReceiveBuffer, 0, httpReaderState.Socket.EndReceive(asyn), (httpReaderState.Socket != null) ? httpReaderState.Socket.Available : 0)) { BeginReceive(httpReaderState); } else { httpReaderState.HttpInboundSocketPipe.Flush(); httpReaderState.Dispose(); } } catch (Exception e) { HandleError(e, httpReaderState); } }
public override void StartReceive() { if (IsClosed) { return; } Socket readSocket = null; HttpObjectParser parser = null; if (isClient) { readSocket = this.PipesChain.ChainState.ClientSocket; parser = new HttpRequestParser(); } else { readSocket = this.PipesChain.ChainState.ServerSocket; parser = new HttpResponseParser(); } HttpReaderState httpReaderState = new HttpReaderState(this, readSocket, parser); BeginReceive(httpReaderState); }
private static bool OnData(HttpReaderState httpReaderState, byte[] b_buffer, int index, int length, int available) { lock (httpReaderState) { if (httpReaderState.HttpObjectParser == null) { throw new Exception("Unknown HTTP Object Parser"); } httpReaderState.TotalReceived += length; if (!httpReaderState.HttpObjectParser.IsInitiated()) { if (httpReaderState.TotalReceived > httpReaderState.ReceiveHeaderBuffer.Length) { throw new Exception("Invalid HTTP Header"); } System.Array.Copy(b_buffer, index, httpReaderState.ReceiveHeaderBuffer, httpReaderState.TotalReceived - length, length); String header = GetHeader(httpReaderState.ReceiveHeaderBuffer, httpReaderState.TotalReceived); if (header != null) { httpReaderState.HttpObjectParser.Initiate(header); httpReaderState.HttpInboundSocketPipe.PipesChain.ChainState["RAW_HEADER_" + ((httpReaderState.HttpInboundSocketPipe.isClient) ? "REQUEST" : "RESPONSE")] = header; if (httpReaderState.HttpInboundSocketPipe.isClient) { httpReaderState.HttpInboundSocketPipe.PipesChain.ChainState["REQUEST_URI"] = ((HttpRequestParser)httpReaderState.HttpObjectParser).URL; } if (httpReaderState.TotalReceived <= header.Length) { length = 0; } byte[] h_buffer = Encoding.ASCII.GetBytes(header); if (h_buffer.Length != 0) { httpReaderState.HttpObjectParser.OnData(h_buffer, 0, h_buffer.Length, available); httpReaderState.HttpInboundSocketPipe.SendData(h_buffer, 0, h_buffer.Length); } if (httpReaderState.TotalReceived - length < h_buffer.Length) { int skip = h_buffer.Length - (httpReaderState.TotalReceived - length); index += skip; length -= skip; } } } if (!httpReaderState.HttpObjectParser.IsInitiated()) { return(true); } httpReaderState.HttpObjectParser.OnData(b_buffer, index, length, available); if (length > 0) { httpReaderState.HttpInboundSocketPipe.SendData(b_buffer, index, length); } int expectedLength = httpReaderState.HttpObjectParser.GetExpectedLength(); if (expectedLength == -2) { //"Continue", Reset reader httpReaderState.HttpInboundSocketPipe.StartReceive(); return(false); } return(expectedLength > httpReaderState.TotalReceived || expectedLength == -1); } }