예제 #1
0
        public void EndSendResponse(uint requestID, ConnectionType ctype)
        {
            isSendingResponse = false;
            m_currentResponse?.Clear();
            m_currentResponse = null;
            lock (m_requestsLock)
                m_waitingResponse = false;

            if (contextID < 0)
            {
                return;
            }

            if (ctype == ConnectionType.Close)
            {
                m_isClosing = true;
                m_requests.Clear();
                TriggerKeepalive = true;
                return;
            }
            else
            {
                LastActivityTimeMS = ContextTimeoutManager.EnvironmentTickCount();
                if (Stream == null || !Stream.CanWrite)
                {
                    return;
                }

                HttpRequest nextRequest = null;
                lock (m_requestsLock)
                {
                    if (m_requests != null && m_requests.Count > 0)
                    {
                        nextRequest = m_requests.Dequeue();
                    }
                    if (nextRequest != null && RequestReceived != null)
                    {
                        m_waitingResponse = true;
                        TriggerKeepalive  = false;
                    }
                    else
                    {
                        TriggerKeepalive = true;
                    }
                }
                if (nextRequest != null)
                {
                    RequestReceived?.Invoke(this, new RequestEventArgs(nextRequest));
                }
            }
        }
예제 #2
0
        private CloudConnectorApiContext ProcessCloudMessage(CloudRequestMessage cloudMessage)
        {
            var apiContext = new CloudConnectorApiContext(cloudMessage);
            var eventArgs  = new ApiRequestReceivedEventArgs(apiContext);

            RequestReceived?.Invoke(this, eventArgs);

            if (!eventArgs.IsHandled)
            {
                apiContext.ResultCode = ApiResultCode.ActionNotSupported;
            }

            return(apiContext);
        }
        private void Communication()
        {
            string exitReason = "None";

            try {
                Debug.WriteLine($"[Server {InstanceId}] Communication Started");
                if (!_streams.WaitForConnectionCancelable())
                {
                    exitReason = "Connect canceled"; return;
                }
                Debug.WriteLine($"[Server {InstanceId}] Communication Connected");
                Connected?.Invoke(this, EventArgs.Empty);

                while (true)
                {
                    if (_disposeFlag)
                    {
                        exitReason = "Disposed"; break;
                    }
                    if (_streams.Reader.EndOfStream)
                    {
                        exitReason = "EndOfStream"; break;
                    }

                    var request = _streams.Reader.ReadLine();                     // TODO read strategy message/byte/line
                    Debug.WriteLine($"[Server {InstanceId}] Communication Received");

                    if (request != null)
                    {
                        var msgEventArgs = new PipeMsgEventArgs(request);
                        RequestReceived.Invoke(this, msgEventArgs);
                        _streams.Writer.WriteLine(msgEventArgs.Response);
                        _streams.Writer.Flush();
                    }
                }
            }
            catch (IOException ex) {
                exitReason = "IOException";
                Debug.WriteLine(ex);
            }
            catch (Exception ex) {
                exitReason = "Exeption";
                Debug.WriteLine(ex);
            }
            finally {
                Debug.WriteLine($"[Server {InstanceId}] Communication exit. Reason: {exitReason}");
                Disconnected?.Invoke(this, EventArgs.Empty);
                Dispose();
            }
        }
        private void DispatchHttpRequest(HttpContext httpContext)
        {
            var apiContext = CreateApiContext(httpContext);

            if (apiContext == null)
            {
                httpContext.Response.StatusCode = HttpStatusCode.BadRequest;
                return;
            }

            var eventArgs = new ApiRequestReceivedEventArgs(apiContext);

            RequestReceived?.Invoke(this, eventArgs);

            if (!eventArgs.IsHandled)
            {
                httpContext.Response.StatusCode = HttpStatusCode.BadRequest;
                return;
            }

            if (eventArgs.Context.Response == null)
            {
                eventArgs.Context.Response = new JObject();
            }

            httpContext.Response.StatusCode = ConvertResultCode(eventArgs.Context.ResultCode);

            if (apiContext.UseHash)
            {
                var serverHash = GenerateHash(apiContext.Response.ToString());
                eventArgs.Context.Response["$Hash"] = serverHash;

                var serverHashWithQuotes = "\"" + serverHash + "\"";

                string clientHash;
                if (httpContext.Request.Headers.TryGetValue(HttpHeaderNames.IfNoneMatch, out clientHash))
                {
                    if (clientHash.Equals(serverHashWithQuotes))
                    {
                        httpContext.Response.StatusCode = HttpStatusCode.NotModified;
                        return;
                    }
                }

                httpContext.Response.Headers[HttpHeaderNames.ETag] = serverHashWithQuotes;
            }

            httpContext.Response.Body = new JsonBody(eventArgs.Context.Response);
        }
예제 #5
0
파일: HttpServer.cs 프로젝트: redbaty/Swebs
 protected virtual void OnRequestReceived(HttpRequestEventArgs e)
 {
     foreach (HttpRequestEventHandler handler in RequestReceived.GetInvocationList())
     {
         try
         {
             handler.Invoke(this, e);
         }
         catch (Exception ex)
         {
             ex.Source = handler.Method.Module + "/" + handler.Method.DeclaringType.Name + "/" + handler.Method.Name;
             RaiseUnhandledException(e.Context, ex);
         }
     }
 }
예제 #6
0
        async void Listener()
        {
            try
            {
                while (udp != null)
                {
                    var result = await udp.ReceiveAsync();

                    RequestReceived?.Invoke(this, result);
                }
            }
            catch (Exception)
            {
                // eat the exception
            }
        }
        protected override Task <HttpResponseMessage> SendAsync(HttpRequestMessage request,
                                                                CancellationToken cancellationToken)
        {
            if (_responses.Count == 0)
            {
                throw new InvalidOperationException("No response configured");
            }

            RequestReceived?.Invoke(this, request);

            _requests.Add(request);

            var response = _responses.Dequeue();

            return(Task.FromResult(response.MakeResponse(cancellationToken)));
        }
예제 #8
0
        private void DispatchRequest(HttpContext httpContext)
        {
            var apiContext = CreateContext(httpContext);

            if (apiContext == null)
            {
                httpContext.Response.StatusCode = HttpStatusCode.BadRequest;
                return;
            }

            var eventArgs = new ApiRequestReceivedEventArgs(apiContext);

            RequestReceived?.Invoke(this, eventArgs);

            if (!eventArgs.IsHandled)
            {
                httpContext.Response.StatusCode = HttpStatusCode.BadRequest;
                return;
            }

            if (eventArgs.Context.Response == null)
            {
                eventArgs.Context.Response = new JsonObject();
            }

            httpContext.Response.StatusCode = ConvertResultCode(eventArgs.Context.ResultCode);

            if (apiContext.CallType == ApiCallType.Request)
            {
                var serverHash           = apiContext.Response.GetNamedObject("Meta", new JsonObject()).GetNamedString("Hash", string.Empty);
                var serverHashWithQuotes = "\"" + serverHash + "\"";

                string clientHash;
                if (httpContext.Request.Headers.TryGetValue(HttpHeaderNames.IfNoneMatch, out clientHash))
                {
                    if (clientHash.Equals(serverHashWithQuotes))
                    {
                        httpContext.Response.StatusCode = HttpStatusCode.NotModified;
                        return;
                    }
                }

                httpContext.Response.Headers[HttpHeaderNames.ETag] = serverHashWithQuotes;
            }

            httpContext.Response.Body = new JsonBody(eventArgs.Context.Response);
        }
예제 #9
0
        public static async Task InitAsync()
        {
            _service = AppServiceConnectionFactory.GetConnection();
            _service.RequestReceived += (AppServiceConnection sender, AppServiceRequestReceivedEventArgs args) =>
            {
                RequestReceived?.Invoke(sender, args);
            };
            _service.ServiceClosed += (AppServiceConnection sender, AppServiceClosedEventArgs args) => { Reconnect($"Service closed: {args.Status}."); };
            var status = await _service.OpenAsync();

            if (status != AppServiceConnectionStatus.Success)
            {
                Reconnect($"Connection to app service failed: {status}.");
                return;
            }
            Debug.WriteLine("Connected to app service.");
        }
예제 #10
0
        public IApiCall Invoke(string action, JObject parameter)
        {
            if (action == null)
            {
                throw new ArgumentNullException(nameof(action));
            }
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }

            var apiCall = new ApiCall(action, parameter, null);

            RequestReceived?.Invoke(this, new ApiRequestReceivedEventArgs(apiCall));

            return(apiCall);
        }
        private void ProcessMessage(string message)
        {
            if (Settings.Default.AddJsonRootObject)
            {
                var json = ParseJson(message, out string root);

                if (root.ToLower() == "request")
                {
                    var request = JsonConvert.DeserializeObject <Request>(json);
                    RequestReceived?.Invoke(this, message);
                    HandleRequest(request);
                }
                else if (root.ToLower() == "acknowledge")
                {
                    AckReceived?.Invoke(this, message);
                }
                else
                {
                    Error?.Invoke(this, new NotSupportedException($"Unknown Message Type: {root}"));
                }
            }
            else
            {
                var root = JsonConvert.DeserializeObject <RootObject>(message);
                switch (root.MessageType)
                {
                case MessageType.Request:
                    var request = JsonConvert.DeserializeObject <Request>(message);
                    RequestReceived?.Invoke(this, message);
                    HandleRequest(request);
                    break;

                case MessageType.Response:
                    break;

                case MessageType.Acknowledge:
                    AckReceived?.Invoke(this, message);
                    break;

                default:
                    Error?.Invoke(this, new NotSupportedException($"Unknown Message Type: {root}"));
                    break;
                }
            }
        }
예제 #12
0
 protected void RaiseOnRequestReceived(string data)
 {
     try
     {
         LogMessage("Request received from", data);
         LinkRequest linkRequest = JsonConvert.DeserializeObject <LinkRequest>(data.ToString());
         RequestReceived?.Invoke(linkRequest);
     }
     catch (Exception e)
     {
         LogError(e.Message, data);
         //if (Connector != null)
         {
             //Connector.Publish(LinkRequestResponseError(null, "DALError", e.Message), new TopicOption[] { TopicOption.Servicer }).ConfigureAwait(false);
             Console.WriteLine($"RaisedOnRequestReceived: exception='{e.Message}'");
         }
     }
 }
예제 #13
0
        internal void OnRequestReceived(HttpClient client, HttpRequest request)
        {
            var args = new RequestEventArgs(client, request);

            RequestReceived?.Invoke(this, args);
            if (request.IsValidRequest)
            {
                if (LogRequests)
                {
                    Log.WriteLine("Request: " + client.RemoteAddress + " " + request.Uri.OriginalString);
                }
                ValidRequestReceived?.Invoke(this, args);
            }
            else
            {
                InvalidRequestReceived?.Invoke(this, args);
            }
        }
        private void DistpachMessage(object sender, MessageReceivedEventArgs e)
        {
            var correlationId = (string)e.Body["CorrelationId"];
            var uri           = (string)e.Body["Uri"];
            var request       = (JObject)e.Body["Content"] ?? new JObject();

            var context   = new QueueBasedApiContext(correlationId, uri, request, new JObject());
            var eventArgs = new ApiRequestReceivedEventArgs(context);

            RequestReceived?.Invoke(this, eventArgs);

            if (!eventArgs.IsHandled)
            {
                context.ResultCode = ApiResultCode.UnknownUri;
            }

            SendResponseMessage(context).Wait();
        }
예제 #15
0
        private void DistpachMessage(object sender, MessageReceivedEventArgs e)
        {
            var apiRequest = e.Body.ToObject <ApiRequest>();

            var correlationId = (string)e.Body["CorrelationId"];

            var context   = new QueueBasedApiContext(correlationId, apiRequest.Action, apiRequest.Parameter, apiRequest.ResultHash);
            var eventArgs = new ApiRequestReceivedEventArgs(context);

            RequestReceived?.Invoke(this, eventArgs);

            if (!eventArgs.IsHandled)
            {
                context.ResultCode = ApiResultCode.ActionNotSupported;
            }

            SendResponseMessage(context).Wait();
        }
예제 #16
0
        private void OnSyncRequestEvent(string sender, IntPtr request, IntPtr response, IntPtr data)
        {
            SafeParcelHandle reqSafeHandle = new SafeParcelHandle(request, false);

            object req = null;

            using (Parcel reqParcel = new Parcel(reqSafeHandle))
            {
                req = FromParcel(reqParcel);
            }

            var args = new RequestEventArgs(sender, req, true);

            RequestReceived?.Invoke(this, args);

            var result = args.Reply;

            if (result == null)
            {
                Log.Error(LogTag, "result is null");
            }
            else if (!result.GetType().IsSerializable)
            {
                Log.Error(LogTag, "result is not serializable");
            }
            else
            {
                SafeParcelHandle resSafeHandle = new SafeParcelHandle(response, false);
                using (Parcel resParcel = new Parcel(resSafeHandle))
                {
                    using (Parcel resultParcel = ToParcel(result))
                    {
                        if (resultParcel != null)
                        {
                            resParcel.UnMarshall(resultParcel.Marshall());
                        }
                        else
                        {
                            Log.Error(LogTag, "Result parcel is null");
                        }
                    }
                }
            }
        }
예제 #17
0
        private bool _disposedValue = false; // To detect redundant calls

        protected virtual void Dispose(bool disposing)
        {
            Log.Info($"{this}:  Dispose({disposing})");

            if (!_disposedValue)
            {
                if (disposing)
                {
                    _closedCancellation.Cancel();

                    foreach (RequestReceived callback in (RequestReceived?.GetInvocationList() ?? Enumerable.Empty <Delegate>()))
                    {
                        RequestReceived -= callback;
                    }

                    _closedCancellation?.Dispose();
                }

                _disposedValue = true;
            }
        }
예제 #18
0
        private void _HandleRequest(RequestMessage message)
        {
            Debug("Handle Request", message);

            RequestContext context = new RequestContext(message, this);

            _requestContexts.Add(context);

            if (message.Method.Equals(CoreMethods.CancelRequest))
            {
                // remove the duplicate context we just added
                _requestContexts.Remove(context);

                // get the original request context
                RequestContext cancelContext = _requestContexts.FirstOrDefault(x => x.Request.Id.Equals(message.Id));
                cancelContext?.Cancel();
            }

            else if (message.Method.Equals(CoreMethods.Initialize))
            {
                State = LanguageServerState.Started;

                InitializeParams parameters = message.Params.ToObject <InitializeParams>();
                Initialize?.Invoke(this, parameters);

                InitializeResult result = new InitializeResult
                {
                    Capabilities = _serverCapabilities
                };

                SendResponseAsync(message.Id, result).Wait();
            }

            else if (message.Method.Equals(CoreMethods.Shutdown))
            {
                SendResponseAsync(message.Id, null).Wait();
            }

            RequestReceived?.Invoke(this, context);
        }
예제 #19
0
        private async void SocketListener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
        {
            if (sender != _socketListener)
            {
                return;
            }

            StreamSocket socket = args.Socket;

            _log.Debug("Incoming connection to {0}:{1} from {2}...", socket.Information.LocalAddress.DisplayName, socket.Information.LocalPort, socket.Information.RemoteAddress.DisplayName);

            HttpRequest request = await HttpRequest.GetHttpRequest(args.Socket);

            if (request == null)
            {
                return;
            }

            _log.Info("Received request from {0}: {1}", socket.Information.RemoteAddress.DisplayName, request.Uri.PathAndQuery);

            RequestReceived.Raise(this, new HttpRequestEventArgs(request));
        }
        /// <summary>
        /// Handles the http request received through Trouter
        /// </summary>
        /// <param name="requestReceived">Http request to be processed</param>
        /// <returns><see cref="HttpResponseMessage"/> to be sent in response of the request</returns>
        private async Task <HttpResponseMessage> ProcessIncomingTrouterRequestAsync(RequestReceived requestReceived)
        {
            try
            {
                m_logger.Information("Incoming callback\r\n " + requestReceived.Body);

                var message = new SerializableHttpRequestMessage();
                message.Method         = requestReceived.HttpMethod;
                message.Uri            = requestReceived.RelativeUri;
                message.LoggingContext = new LoggingContext(Guid.NewGuid());
                message.Content        = requestReceived.Body;
                message.ContentType    = "application/json";
                message.IsIncoming     = true;
                message.Timestamp      = DateTime.UtcNow;

                if (requestReceived.Headers != null)
                {
                    message.RequestHeaders = new List <Tuple <string, string> >();
                    foreach (KeyValuePair <string, string> header in requestReceived.Headers)
                    {
                        if (!string.IsNullOrEmpty(header.Key) && !string.IsNullOrEmpty(header.Value))
                        {
                            message.RequestHeaders.Add(new Tuple <string, string>(header.Key, header.Value));
                        }
                    }
                }

                // Suppress the warning
                await Task.CompletedTask.ConfigureAwait(false);

                // Pass down the response to event channel
                HandleIncomingEvents?.Invoke(this, new EventsChannelArgs(message));
            }
            catch (Exception ex)
            {
                Debug.Assert(false, "unexpected exception: " + ex.ToString());
            }
            return(new HttpResponseMessage(HttpStatusCode.OK));
        }
예제 #21
0
        private void OnApiRequestReceived(HttpContext context)
        {
            IApiCall apiCall = CreateApiContext(context);

            if (apiCall == null)
            {
                context.Response.StatusCode = HttpStatusCode.BadRequest;
                return;
            }

            var eventArgs = new ApiRequestReceivedEventArgs(apiCall);

            RequestReceived?.Invoke(this, eventArgs);

            if (!eventArgs.IsHandled)
            {
                context.Response.StatusCode = HttpStatusCode.BadRequest;
                return;
            }

            context.Response.StatusCode = HttpStatusCode.Ok;
            if (eventArgs.ApiContext.Result == null)
            {
                eventArgs.ApiContext.Result = new JObject();
            }

            var apiResponse = new ApiResponse
            {
                ResultCode = apiCall.ResultCode,
                Result     = apiCall.Result,
                ResultHash = apiCall.ResultHash
            };

            var json = JsonConvert.SerializeObject(apiResponse);

            context.Response.Body     = Encoding.UTF8.GetBytes(json);
            context.Response.MimeType = MimeTypeProvider.Json;
        }
예제 #22
0
        private void DistpachMessage(object sender, MessageReceivedEventArgs e)
        {
            Stopwatch processingStopwatch = Stopwatch.StartNew();

            string uri = e.Body.GetNamedString("Uri", string.Empty);

            if (string.IsNullOrEmpty(uri))
            {
                Log.Warning("Received Azure queue message with missing or invalid URI property.");
                return;
            }

            string callTypeSource = e.Body.GetNamedString("CallType", string.Empty);

            ApiCallType callType;

            if (!Enum.TryParse(callTypeSource, true, out callType))
            {
                Log.Warning("Received Azure queue message with missing or invalid CallType property.");
                return;
            }

            var request = e.Body.GetNamedObject("Content", new JsonObject());

            var context   = new QueueBasedApiContext(e.BrokerProperties, e.Body, processingStopwatch, callType, uri, request, new JsonObject());
            var eventArgs = new ApiRequestReceivedEventArgs(context);

            RequestReceived?.Invoke(this, eventArgs);

            if (!eventArgs.IsHandled)
            {
                Log.Warning("Received Azure queue message is not handled.");
                Log.Warning("Received Azure queue message is not handled.");
                return;
            }

            SendResponseMessage(context).Wait();
        }
예제 #23
0
        private void Listen()
        {
            Log.F("Listening thread started.", "http_server.log");

            while (_listening)
            {
                try
                {
                    var ctx = _server.GetContext();
                    using (var reader = new StreamReader(ctx.Request.InputStream, ctx.Request.ContentEncoding))
                    {
                        var stringReq = reader.ReadToEnd();
                        var jsonReq   = JObject.Parse(stringReq);
                        if (jsonReq.ContainsKey(Request.MethodKey))
                        {
                            RequestReceived?.Invoke(new Request(jsonReq));
                        }
                        else if (jsonReq.ContainsKey(Response.ErrorKey) || jsonReq.ContainsKey(Response.ResultKey))
                        {
                            ResponseReceived?.Invoke(new Response(jsonReq));
                        }
                        else
                        {
                            Log.CW("[Server] Unknown message type.");
                        }
                        ctx.Response.StatusCode = 200;
                        ctx.Response.Close();
                    }
                }
                catch (Exception e)
                {
                    Log.CW($"[Server] Error while parsing request: {e}");
                    Log.F($"Error while parsing request: {e}", "http_server.log");
                }
            }
            Log.F("Exiting listening thread.", "http_server.log");
        }
예제 #24
0
        private async Task QueueListener_RequestReceived(object sender, RequestReceivedEventArgs e)
        {
            var iMessages = Counters.IncrementMessages();

            try
            {
                Counters.IncrementReceivingTime(e.Request.Header.TotalTime);
                if (_serverQueues?.AdditionalSendQueues?.Any() == true)
                {
                    e.ResponseQueues.AddRange(_serverQueues.AdditionalSendQueues);
                }
                e.Response.Header.Response.Label = Config.ResponseOptions.ServerSenderOptions.Label;
                Core.Log.InfoDetail("Request message received with CorrelationId = {0} . Current messages processing = {1}", e.Request.CorrelationId, iMessages);
                if (RequestReceived != null)
                {
                    await RequestReceived.InvokeAsync(sender, e).ConfigureAwait(false);
                }
                e.Response.Header.Response.Label = string.IsNullOrEmpty(e.Response.Header.Response.Label) ? e.Response.Body?.ToString() ?? typeof(ResponseMessage).FullName : e.Response.Header.Response.Label;
                if (MQueueServerEvents.RequestReceived != null)
                {
                    await MQueueServerEvents.RequestReceived.InvokeAsync(sender, e).ConfigureAwait(false);
                }

                if (e.SendResponse && e.Response?.Body != ResponseMessage.NoResponse)
                {
                    e.Response.Header.Response.ApplicationSentDate = Core.Now;

                    ResponseSentEventArgs rsea = null;
                    if (BeforeSendResponse != null || MQueueServerEvents.BeforeSendResponse != null ||
                        ResponseSent != null || MQueueServerEvents.ResponseSent != null)
                    {
                        rsea = new ResponseSentEventArgs(Name, e.Response);
                        if (BeforeSendResponse != null)
                        {
                            await BeforeSendResponse.InvokeAsync(this, rsea).ConfigureAwait(false);
                        }
                        if (MQueueServerEvents.BeforeSendResponse != null)
                        {
                            await MQueueServerEvents.BeforeSendResponse.InvokeAsync(this, rsea).ConfigureAwait(false);
                        }
                    }

                    var sentBytes = await OnSendAsync(e.Response, e).ConfigureAwait(false);

                    if (sentBytes > -1)
                    {
                        if (rsea != null)
                        {
                            rsea.MessageLength = sentBytes;
                            if (ResponseSent != null)
                            {
                                await ResponseSent.InvokeAsync(this, rsea).ConfigureAwait(false);
                            }
                            if (MQueueServerEvents.ResponseSent != null)
                            {
                                await MQueueServerEvents.ResponseSent.InvokeAsync(this, rsea).ConfigureAwait(false);
                            }
                        }
                    }
                    else
                    {
                        Core.Log.Warning("The message couldn't be sent.");
                    }
                }
                Counters.DecrementMessages();
                Counters.IncrementTotalMessagesProccesed();
            }
            catch (Exception)
            {
                Counters.IncrementTotalExceptions();
                Counters.DecrementMessages();
                throw;
            }
        }
 protected virtual void OnRequestReceived(HttpListenerContext context)
 {
     RequestReceived?.Invoke(this, new EventArgs <HttpListenerContext>(context));
 }
예제 #26
0
 protected virtual void OnRequestReceived(HttpServerEventArgs <TContext> e)
 {
     RequestReceived?.Invoke(this, e);
 }
예제 #27
0
        /// <summary>
        /// Processes a request message.
        /// </summary>
        private bool ProcessRequestMessage(uint messageType, ArraySegment <byte> messageChunk)
        {
            // validate the channel state.
            if (State != TcpChannelState.Open)
            {
                ForceChannelFault(StatusCodes.BadTcpMessageTypeInvalid, "Client sent an unexpected request message.");
                return(false);
            }

            // validate security on the message.
            ChannelToken token          = null;
            uint         requestId      = 0;
            uint         sequenceNumber = 0;

            ArraySegment <byte> messageBody;

            try
            {
                messageBody = ReadSymmetricMessage(messageChunk, true, out token, out requestId, out sequenceNumber);

                // check for replay attacks.
                if (!VerifySequenceNumber(sequenceNumber, "ProcessRequestMessage"))
                {
                    throw new ServiceResultException(StatusCodes.BadSequenceNumberInvalid);
                }

                if (token == CurrentToken && PreviousToken != null && !PreviousToken.Expired)
                {
                    Utils.Trace("Server Revoked Token. ChannelId={1}, TokenId={0}", PreviousToken.TokenId, PreviousToken.ChannelId, DateTime.UtcNow);
                    PreviousToken.Lifetime = 0;
                }
            }
            catch (Exception e)
            {
                Utils.Trace("Could not verify security on incoming request.");
                ForceChannelFault(e, StatusCodes.BadSecurityChecksFailed, "Could not verify security on incoming request.");
                return(false);
            }

            BufferCollection chunksToProcess = null;

            try
            {
                // check for an abort.
                if (TcpMessageType.IsAbort(messageType))
                {
                    Utils.Trace("Request was aborted.");
                    chunksToProcess = GetSavedChunks(requestId, messageBody);
                    return(true);
                }

                // check if it is necessary to wait for more chunks.
                if (!TcpMessageType.IsFinal(messageType))
                {
                    SaveIntermediateChunk(requestId, messageBody);
                    return(true);
                }

                Utils.Trace("Channel {0}: ProcessRequestMessage {1}", ChannelId, requestId);

                // get the chunks to process.
                chunksToProcess = GetSavedChunks(requestId, messageBody);

                // decode the request.
                IServiceRequest request = BinaryDecoder.DecodeMessage(new ArraySegmentStream(chunksToProcess), null, Quotas.MessageContext) as IServiceRequest;

                if (request == null)
                {
                    SendServiceFault(token, requestId, ServiceResult.Create(StatusCodes.BadStructureMissing, "Could not parse request body."));
                    return(true);
                }

                // ensure that only discovery requests come through unsecured.
                if (DiscoveryOnly)
                {
                    if (!(request is GetEndpointsRequest || request is FindServersRequest))
                    {
                        SendServiceFault(token, requestId, ServiceResult.Create(StatusCodes.BadSecurityPolicyRejected, "Channel can only be used for discovery."));
                        return(true);
                    }
                }

                // hand the request to the server.
                RequestReceived?.Invoke(this, requestId, request);

                return(true);
            }
            catch (Exception e)
            {
                Utils.Trace(e, "Unexpected error processing request.");
                SendServiceFault(token, requestId, ServiceResult.Create(e, StatusCodes.BadTcpInternalError, "Unexpected error processing request."));
                return(true);
            }
            finally
            {
                if (chunksToProcess != null)
                {
                    chunksToProcess.Release(BufferManager, "ProcessRequestMessage");
                }
            }
        }
예제 #28
0
        private void OnRequestCompleted(object source, EventArgs args)
        {
            TriggerKeepalive        = false;
            MonitorKeepaliveStartMS = 0;
            FullRequestReceived     = true;
            LastActivityTimeMS      = ContextTimeoutManager.EnvironmentTickCount();

            if (m_maxRequests == 0)
            {
                return;
            }

            if (--m_maxRequests == 0)
            {
                m_currentRequest.Connection = ConnectionType.Close;
            }

            if (m_currentRequest.Uri == null)
            {
                // should not happen
                try
                {
                    Uri uri = new Uri(m_currentRequest.Secure ? "https://" : "http://" + m_currentRequest.UriPath);
                    m_currentRequest.Uri     = uri;
                    m_currentRequest.UriPath = uri.AbsolutePath;
                }
                catch
                {
                    return;
                }
            }

            // load cookies if they exist
            if (m_currentRequest.Headers["cookie"] != null)
            {
                m_currentRequest.SetCookies(new RequestCookies(m_currentRequest.Headers["cookie"]));
            }

            m_currentRequest.Body.Seek(0, SeekOrigin.Begin);

            bool donow = true;

            lock (m_requestsLock)
            {
                if (m_waitingResponse)
                {
                    m_requests.Enqueue(m_currentRequest);
                    donow = false;
                }
                else
                {
                    m_waitingResponse = true;
                }
            }

            if (donow)
            {
                RequestReceived?.Invoke(this, new RequestEventArgs(m_currentRequest));
            }

            m_currentRequest = new HttpRequest(this);
        }
예제 #29
0
 protected virtual void OnRequestReceived(RequestReceivedArgs <TMessage> e)
 {
     RequestReceived?.Invoke(this, e);
 }
예제 #30
0
 private void OnRequestReceived(object sender, RequestEventArgs e)
 {
     RequestReceived?.Invoke(sender, e);
 }