private void onRead(IAsyncResult asyncResult) { var rstate = (ReadBufferState)asyncResult.AsyncState; var ares = rstate.AsyncResult; try { var nread = base.EndRead(asyncResult); _decoder.Write(ares.Buffer, ares.Offset, nread); nread = _decoder.Read(rstate.Buffer, rstate.Offset, rstate.Count); rstate.Offset += nread; rstate.Count -= nread; if (rstate.Count == 0 || !_decoder.WantsMore || nread == 0) { _noMoreData = !_decoder.WantsMore && nread == 0; ares.Count = rstate.InitialCount - rstate.Count; ares.Complete(); return; } base.BeginRead(ares.Buffer, ares.Offset, ares.Count, onRead, rstate); } catch (Exception ex) { _context.ErrorMessage = "I/O operation aborted"; _context.SendError(); ares.Complete(ex); } }
private void onRead(IAsyncResult asyncResult) { var rstate = (ReadBufferState)asyncResult.AsyncState; var ares = rstate.AsyncResult; try { var nread = base.EndRead(asyncResult); _decoder.Write(ares.Buffer, ares.Offset, nread); nread = _decoder.Read(rstate.Buffer, rstate.Offset, rstate.Count); rstate.Offset += nread; rstate.Count -= nread; if (rstate.Count == 0 || !_decoder.WantMore || nread == 0) { _noMoreData = !_decoder.WantMore && nread == 0; ares.Count = rstate.InitialCount - rstate.Count; ares.Complete(); return; } ares.Offset = 0; ares.Count = Math.Min(_bufferLength, _decoder.ChunkLeft + 6); base.BeginRead(ares.Buffer, ares.Offset, ares.Count, onRead, rstate); } catch (Exception ex) { _context.ErrorMessage = ex.Message; _context.SendError(); ares.Complete(ex); } }
private bool processRequestBuffer() { // This method returns a bool: // - true Done processing // - false Need more write var data = _requestBuffer.GetBuffer(); var len = (int)_requestBuffer.Length; if (!processInput(data, len)) { return(false); } var req = _context.Request; if (!_context.HasErrorMessage) { req.FinishInitialization(); } if (_context.HasErrorMessage) { _context.SendError(); return(true); } var uri = req.Url; HttpListener httplsnr; if (!_endPointListener.TrySearchHttpListener(uri, out httplsnr)) { _context.SendError(404); return(true); } httplsnr.RegisterContext(_context); return(true); }
internal bool RegisterContext(HttpListenerContext context) { if (!authenticateContext(context)) { return(false); } if (!registerContext(context)) { context.SendError(503); return(false); } return(true); }
private void registerContext(HttpListener listener) { _context.Listener = listener; if (!_context.Authenticate()) { return; } if (!_context.Register()) { _context.ErrorStatusCode = 503; _context.SendError(); return; } _contextRegistered = true; }
internal bool AuthenticateContext(HttpListenerContext context) { var req = context.Request; var schm = selectAuthenticationScheme(req); if (schm == AuthenticationSchemes.Anonymous) { return(true); } if (schm == AuthenticationSchemes.None) { context.ErrorStatusCode = 403; context.ErrorMessage = "Authentication not allowed"; context.SendError(); return(false); } var realm = getRealm(); var user = HttpUtility.CreateUser( req.Headers["Authorization"], schm, realm, req.HttpMethod, _userCredFinder ); var authenticated = user != null && user.Identity.IsAuthenticated; if (!authenticated) { context.SendAuthenticationChallenge(schm, realm); return(false); } context.User = user; return(true); }