/// <summary>
        /// Creates a response from the compatible headers.
        /// </summary>
        /// <param name="compatibleHeaders">The compatible headers.</param>
        /// <param name="negotiationContext">The negotiation context.</param>
        /// <param name="context">The context.</param>
        /// <returns>A <see cref="Response"/>.</returns>
        private Response CreateResponse(IList <CompatibleHeader> compatibleHeaders,
                                        NegotiationContext negotiationContext,
                                        NancyContext context)
        {
            var response = NegotiateResponse(compatibleHeaders, negotiationContext, context);

            if (response == null)
            {
                context.WriteTraceLog(sb =>
                                      sb.AppendLine("[DefaultResponseNegotiator] Unable to negotiate response - no processors returned valid response"));

                response = new NotAcceptableResponse();
            }

            response.WithHeader("Vary", "Accept");

            this.AddLinkHeader(compatibleHeaders, response, context.Request.Url);
            SetStatusCode(negotiationContext, response);
            SetReasonPhrase(negotiationContext, response);
            AddCookies(negotiationContext, response);

            if (response is NotAcceptableResponse)
            {
                return(response);
            }

            AddContentTypeHeader(negotiationContext, response);
            AddNegotiatedHeaders(negotiationContext, response);

            return(response);
        }
Example #2
0
        private Response ProcessAsNegotiator(object routeResult, NancyContext context)
        {
            context.WriteTraceLog(sb => sb.AppendLine("[DefaultRouteInvoker] Processing as negotiation"));

            var negotiator =
                GetNegotiator(routeResult, context);

            context.WriteTraceLog(sb =>
            {
                var allowableFormats = negotiator.NegotiationContext
                                       .PermissableMediaRanges
                                       .Select(mr => mr.ToString())
                                       .Aggregate((t1, t2) => t1 + ", " + t2);

                var acceptFormants = context.Request.Headers["accept"]
                                     .Aggregate((t1, t2) => t1 + ", " + t2);

                sb.AppendFormat("[DefaultRouteInvoker] Accept header: {0}\n", acceptFormants);
                sb.AppendFormat("[DefaultRouteInvoker] Acceptable media ranges: {0}\n", allowableFormats);
            });

            var compatibleHeaders =
                this.GetCompatibleHeaders(context, negotiator);

            if (!compatibleHeaders.Any())
            {
                context.WriteTraceLog(sb => sb.AppendLine("[DefaultRouteInvoker] Unable to negotiate response - no headers compatible"));

                return(new NotAcceptableResponse());
            }

            var response =
                NegotiateResponse(compatibleHeaders, routeResult, negotiator, context);

            if (response == null)
            {
                context.WriteTraceLog(sb => sb.AppendLine("[DefaultRouteInvoker] Unable to negotiate response - no processors returned valid response"));

                response = new NotAcceptableResponse();
            }

            if (compatibleHeaders.Count() > 1)
            {
                response.WithHeader("Vary", "Accept");
            }

            AddLinkHeaders(context, compatibleHeaders, response);

            if (!(response is NotAcceptableResponse))
            {
                AddNegotiatedHeaders(negotiator, response);
            }

            if (negotiator.NegotiationContext.StatusCode.HasValue)
            {
                response.StatusCode = negotiator.NegotiationContext.StatusCode.Value;
            }

            return(response);
        }
        /// <summary>
        /// Creates a response from the compatible headers.
        /// </summary>
        /// <param name="compatibleHeaders">The compatible headers.</param>
        /// <param name="negotiationContext">The negotiation context.</param>
        /// <param name="context">The context.</param>
        /// <returns>A <see cref="Response"/>.</returns>
        private static Response CreateResponse(
            IList<CompatibleHeader> compatibleHeaders,
            NegotiationContext negotiationContext,
            NancyContext context)
        {
            var response = NegotiateResponse(compatibleHeaders, negotiationContext, context);

            if (response == null)
            {
                context.WriteTraceLog(sb =>
                    sb.AppendLine("[DefaultResponseNegotiator] Unable to negotiate response - no processors returned valid response"));

                response = new NotAcceptableResponse();
            }

            response.WithHeader("Vary", "Accept");

            AddLinkHeader(compatibleHeaders, response, context.Request.Url);
            SetStatusCode(negotiationContext, response);
            SetReasonPhrase(negotiationContext, response);
            AddCookies(negotiationContext, response);

            if (response is NotAcceptableResponse)
            {
                return response;
            }

            AddContentTypeHeader(negotiationContext, response);
            AddNegotiatedHeaders(negotiationContext, response);

            return response;
        }
        private Response ProcessAsNegotiator(object routeResult, NancyContext context)
        {
            context.WriteTraceLog(sb => sb.AppendLine("[DefaultRouteInvoker] Processing as negotiation"));

            var negotiator = GetNegotiator(routeResult, context);

            var coercedAcceptHeaders = this.GetCoercedAcceptHeaders(context).ToArray();

            context.WriteTraceLog(
                sb =>
            {
                var allowableFormats =
                    negotiator.NegotiationContext.PermissableMediaRanges.Select(mr => mr.ToString())
                    .Aggregate((t1, t2) => t1 + ", " + t2);

                var originalAccept = context.Request.Headers["accept"].Any()
                                             ? string.Join(", ", context.Request.Headers["accept"])
                                             : "None";

                var coercedAccept = coercedAcceptHeaders.Any()
                                            ? coercedAcceptHeaders.Select(h => h.Item1)
                                    .Aggregate((t1, t2) => t1 + ", " + t2)
                                            : "None";

                sb.AppendFormat("[DefaultRouteInvoker] Original accept header: {0}\n", originalAccept);
                sb.AppendFormat("[DefaultRouteInvoker] Coerced accept header: {0}\n", coercedAccept);
                sb.AppendFormat("[DefaultRouteInvoker] Acceptable media ranges: {0}\n", allowableFormats);
            });

            var compatibleHeaders = this.GetCompatibleHeaders(coercedAcceptHeaders, context, negotiator);

            if (!compatibleHeaders.Any())
            {
                context.WriteTraceLog(
                    sb => sb.AppendLine("[DefaultRouteInvoker] Unable to negotiate response - no headers compatible"));

                return(new NotAcceptableResponse());
            }

            var response = NegotiateResponse(compatibleHeaders, routeResult, negotiator, context);

            if (response == null)
            {
                context.WriteTraceLog(
                    sb =>
                    sb.AppendLine(
                        "[DefaultRouteInvoker] Unable to negotiate response - no processors returned valid response"));

                response = new NotAcceptableResponse();
            }

            response.WithHeader("Vary", "Accept");

            AddLinkHeaders(context, compatibleHeaders, response);

            if (!(response is NotAcceptableResponse))
            {
                CheckForContentTypeHeader(negotiator, response);
                AddNegotiatedHeaders(negotiator, response);
            }

            if (negotiator.NegotiationContext.StatusCode.HasValue)
            {
                response.StatusCode = negotiator.NegotiationContext.StatusCode.Value;
            }

            foreach (var cookie in negotiator.NegotiationContext.Cookies)
            {
                response.Cookies.Add(cookie);
            }

            return(response);
        }
Example #5
0
        private Response ProcessAsNegotiator(object routeResult, NancyContext context)
        {
            context.WriteTraceLog(sb => sb.AppendLine("[DefaultRouteInvoker] Processing as negotiation"));

            var negotiator =
                GetNegotiator(routeResult, context);

            context.WriteTraceLog(sb =>
                                      {
                                          var allowableFormats = negotiator.NegotiationContext
                                              .PermissableMediaRanges
                                              .Select(mr => mr.ToString())
                                              .Aggregate((t1, t2) => t1 + ", " + t2);

                                          var acceptFormants = context.Request.Headers["accept"]
                                                                              .Aggregate((t1, t2) => t1 + ", " + t2);

                                          sb.AppendFormat("[DefaultRouteInvoker] Accept header: {0}\n", acceptFormants);
                                          sb.AppendFormat("[DefaultRouteInvoker] Acceptable media ranges: {0}\n", allowableFormats);
                                      });

            var compatibleHeaders =
                this.GetCompatibleHeaders(context, negotiator);

            if (!compatibleHeaders.Any())
            {
                context.WriteTraceLog(sb => sb.AppendLine("[DefaultRouteInvoker] Unable to negotiate response - no headers compatible"));

                return new NotAcceptableResponse();
            }

            var response =
                NegotiateResponse(compatibleHeaders, routeResult, negotiator, context);

            if (response == null)
            {
                context.WriteTraceLog(sb => sb.AppendLine("[DefaultRouteInvoker] Unable to negotiate response - no processors returned valid response"));

                response = new NotAcceptableResponse();
            }

            if (compatibleHeaders.Count() > 1)
            {
                response.WithHeader("Vary", "Accept");
            }

            AddLinkHeaders(context, compatibleHeaders, response);

            if (!(response is NotAcceptableResponse))
            {
                AddNegotiatedHeaders(negotiator, response);
            }

            return response;
        }
        /// <summary>
        /// Asynchronously seed the data store.
        /// </summary>
        /// <returns>
        /// The <see cref="Task{Response}"/>.
        /// </returns>
        internal async Task <Response> SeedDataStore()
        {
            if (!AppConfig.Current.Backtier.IsDbSeedEnabled)
            {
                Logger.Info(
                    "Data store seed API invoked but it was disabled from configuration, cancel further processing...");
                var notAcceptableResponse = new Response().WithStatusCode(HttpStatusCode.NotAcceptable);
                this.HeaderInfoProvider.RegisterResponseHeaders(notAcceptableResponse);
                return(notAcceptableResponse);
            }

            Logger.Info("Starting data store seeding");

            // bind the request to the specialized model
            var exchangeFileRequest = this.Bind <ExchangeFileUploadRequest>();

            // make sure there is only one file
            if (exchangeFileRequest.File == null)
            {
                var badRequestResponse = new Response().WithStatusCode(HttpStatusCode.BadRequest);
                this.HeaderInfoProvider.RegisterResponseHeaders(badRequestResponse);
                return(badRequestResponse);
            }

            // stream the file to disk
            var filePath = await this.LocalFileStorage.StreamFileToDisk(exchangeFileRequest.File.Value);

            // drop existing data stores
            this.DropDataStoreAndPrepareNew();

            // handle exchange processing
            if (!this.InsertModelData(filePath, exchangeFileRequest.Password))
            {
                var errorResponse = new NotAcceptableResponse();
                this.HeaderInfoProvider.RegisterResponseHeaders(errorResponse);
                return(errorResponse);
            }

            // Remove the exchange file after processing (saving space)
            try
            {
                this.LocalFileStorage.RemoveFileFromDisk(filePath);
            }
            catch (Exception ex)
            {
                // swallow exception but log it
                Logger.Error(ex, "Unable to remove file");
            }

            try
            {
                // Create a jsonb for each entry in the database
                this.CreateRevisionHistoryForEachEntry();

                // database was succesfully seeded
                this.DataStoreController
                .CloneDataStore();     // create a clone of the data store for future restore support

                // reset the credential cache as the underlying datastore was reset
                this.WebServiceAuthentication.ResetCredentialCache();

                var response = new Response().WithStatusCode(HttpStatusCode.OK);
                this.HeaderInfoProvider.RegisterResponseHeaders(response);

                Logger.Info("Finished the data store seed");
                return(response);
            }
            catch (Exception ex)
            {
                Logger.Error(ex, "Unable to dump the datastore");
                var errorResponse = new Response().WithStatusCode(HttpStatusCode.InternalServerError);
                this.HeaderInfoProvider.RegisterResponseHeaders(errorResponse);
                return(errorResponse);
            }
        }