protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            IRestClient client;
            IRestResponse <SmsRouteResponse> response;
            SmsRouteResponse routeResponse;
            UriBuilder       uriBuilder;

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            _ptLogger.LogInfo($"{request.RequestUri.AbsoluteUri}: Request processing started");

            // GET
            if (request.Method == HttpMethod.Get)
            {
                GetDefaultRoute(request);

                stopwatch.Stop();
                _ptLogger.LogInfo($"{request.Method} request routed to {request.RequestUri.AbsoluteUri} in {stopwatch.ElapsedMilliseconds} ms");

                return(await base.SendAsync(request, cancellationToken));
            }

            // Other than GET
            var requestContent = request.Content.ReadAsStringAsync().Result;

            if (requestContent == null)
            {
                GetDefaultRoute(request);

                stopwatch.Stop();
                _ptLogger.LogInfo($"{request.Method} request content is blank: {request.RequestUri.AbsoluteUri}. Routed to default route in {stopwatch.ElapsedMilliseconds} ms");
                return(await base.SendAsync(request, cancellationToken));
            }

            dynamic requestObject = JsonConvert.DeserializeObject <object>(requestContent);

            if (requestObject == null)
            {
                GetDefaultRoute(request);

                stopwatch.Stop();
                _ptLogger.LogInfo($"{request.Method} request has no parameter(s): {request.RequestUri.AbsoluteUri}. Routed to default route in {stopwatch.ElapsedMilliseconds} ms");
                return(await base.SendAsync(request, cancellationToken));
            }

            var requestKeyValueList = GetRequestPropertyKeys(requestObject);

            // Request may not have a username
            if (!requestKeyValueList.Contains("UserName"))
            {
                GetDefaultRoute(request);

                stopwatch.Stop();
                _ptLogger.LogInfo($"{request.Method} request is missing a UserName: {request.RequestUri.AbsoluteUri}. Routed to default route in {stopwatch.ElapsedMilliseconds} ms");

                return(await base.SendAsync(request, cancellationToken));
            }

            // For now partition request by JobId
            // Else partition by username only
            var userName      = requestObject.UserName;
            var routeElements = new StringBuilder(userName.ToString());

            int?id = null;

            if (requestKeyValueList.Contains("JobId"))
            {
                id = requestObject.JobId;
                routeElements.Append($"|{id.ToString()}");
            }

            // Get route by username and Id if available
            client   = _restClientFactory.GetShapeManagerRouterServiceClient();
            response = client.ExecutePostWithRetry <SmsRouteResponse>("router/route", new SmsRouteRequest {
                HttpMethod = request.Method, Id = id, UserName = userName
            });
            routeResponse = response.Data;
            uriBuilder    = new UriBuilder(request.RequestUri)
            {
                Host = routeResponse.Host, Port = routeResponse.Port
            };

            request.RequestUri = uriBuilder.Uri;

            stopwatch.Stop();
            _ptLogger.LogInfo($"{request.Method} request [{routeElements}] routed to {request.RequestUri.AbsoluteUri} in {stopwatch.ElapsedMilliseconds} ms");

            return(await base.SendAsync(request, cancellationToken));
        }