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);
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        internal bool RegisterContext(HttpListenerContext context)
        {
            if (!authenticateContext(context))
            {
                return(false);
            }

            if (!registerContext(context))
            {
                context.SendError(503);

                return(false);
            }

            return(true);
        }
예제 #5
0
        private void registerContext(HttpListener listener)
        {
            _context.Listener = listener;

            if (!_context.Authenticate())
            {
                return;
            }

            if (!_context.Register())
            {
                _context.ErrorStatusCode = 503;
                _context.SendError();

                return;
            }

            _contextRegistered = true;
        }
예제 #6
0
        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);
        }