public StoreResponse GetInjectedServerError()

in Microsoft.Azure.Cosmos/FaultInjection/src/implementation/FaultInjectionServerErrorResultInternal.cs [138:272]


        public StoreResponse GetInjectedServerError(ChannelCallArguments args, string ruleId)
        {
            StoreResponse storeResponse;
            string lsn = args.RequestHeaders.Get(WFConstants.BackendHeaders.LSN) ?? "0";

            switch (this.serverErrorType)
            {
                case FaultInjectionServerErrorType.Gone:
                    INameValueCollection goneHeaders = args.RequestHeaders;
                    goneHeaders.Set(WFConstants.BackendHeaders.SubStatus, ((int)SubStatusCodes.ServerGenerated410).ToString(CultureInfo.InvariantCulture));
                    goneHeaders.Set(WFConstants.BackendHeaders.LocalLSN, lsn);
                    storeResponse = new StoreResponse()
                    {
                        Status = 410,
                        Headers = goneHeaders,
                        ResponseBody = new MemoryStream(FaultInjectionResponseEncoding.GetBytes($"Fault Injection Server Error: Gone, rule: {ruleId}"))
                    };

                    return storeResponse;

                case FaultInjectionServerErrorType.RetryWith:
                    INameValueCollection retryWithHeaders = args.RequestHeaders;
                    retryWithHeaders.Set(WFConstants.BackendHeaders.LocalLSN, lsn);
                    storeResponse = new StoreResponse()
                    {
                        Status = 449,
                        Headers = retryWithHeaders,
                        ResponseBody = new MemoryStream(FaultInjectionResponseEncoding.GetBytes($"Fault Injection Server Error: Retry With, rule: {ruleId}"))
                    };
                    
                    return storeResponse;

                case FaultInjectionServerErrorType.TooManyRequests:
                    INameValueCollection tooManyRequestsHeaders = args.RequestHeaders;
                    tooManyRequestsHeaders.Set(HttpConstants.HttpHeaders.RetryAfterInMilliseconds, "500");
                    tooManyRequestsHeaders.Set(WFConstants.BackendHeaders.SubStatus, ((int)SubStatusCodes.RUBudgetExceeded).ToString(CultureInfo.InvariantCulture));
                    tooManyRequestsHeaders.Set(WFConstants.BackendHeaders.LocalLSN, lsn);

                    storeResponse = new StoreResponse()
                    {
                        Status = 429,
                        Headers = tooManyRequestsHeaders,
                        ResponseBody = new MemoryStream(FaultInjectionResponseEncoding.GetBytes($"Fault Injection Server Error: Too Many Requests, rule: {ruleId}"))
                    };

                    return storeResponse;

                case FaultInjectionServerErrorType.Timeout:
                    INameValueCollection timeoutHeaders = args.RequestHeaders;
                    timeoutHeaders.Set(WFConstants.BackendHeaders.LocalLSN, lsn);

                    storeResponse = new StoreResponse()
                    {
                        Status = 408,
                        Headers = timeoutHeaders,
                        ResponseBody = new MemoryStream(FaultInjectionResponseEncoding.GetBytes($"Fault Injection Server Error: Timeout, rule: {ruleId}"))
                    };

                    return storeResponse;

                case FaultInjectionServerErrorType.InternalServerError:
                    INameValueCollection internalServerErrorHeaders = args.RequestHeaders;
                    internalServerErrorHeaders.Set(WFConstants.BackendHeaders.LocalLSN, lsn);

                    storeResponse = new StoreResponse()
                    {
                        Status = 500,
                        Headers = internalServerErrorHeaders,
                        ResponseBody = new MemoryStream(FaultInjectionResponseEncoding.GetBytes($"Fault Injection Server Error: Internal Server Error, rule: {ruleId}"))
                    };
                    
                    return storeResponse;

                case FaultInjectionServerErrorType.ReadSessionNotAvailable:

                    const string badSesstionToken = "1:1#1#1=1#1=1";

                    INameValueCollection readSessionHeaders = args.RequestHeaders;
                    readSessionHeaders.Set(WFConstants.BackendHeaders.SubStatus, ((int)SubStatusCodes.ReadSessionNotAvailable).ToString(CultureInfo.InvariantCulture));
                    readSessionHeaders.Set(HttpConstants.HttpHeaders.SessionToken, badSesstionToken);
                    readSessionHeaders.Set(WFConstants.BackendHeaders.LocalLSN, lsn);

                    storeResponse = new StoreResponse()
                    {
                        Status = 404,
                        Headers = readSessionHeaders,
                        ResponseBody = new MemoryStream(FaultInjectionResponseEncoding.GetBytes($"Fault Injection Server Error: Read Session Not Available, rule: {ruleId}"))
                    };
                    
                    return storeResponse;

                case FaultInjectionServerErrorType.PartitionIsMigrating:
                    INameValueCollection partitionMigrationHeaders = args.RequestHeaders;
                    partitionMigrationHeaders.Set(WFConstants.BackendHeaders.SubStatus, ((int)SubStatusCodes.CompletingPartitionMigration).ToString(CultureInfo.InvariantCulture));
                    partitionMigrationHeaders.Set(WFConstants.BackendHeaders.LocalLSN, lsn);

                    storeResponse = new StoreResponse()
                    {
                        Status = 410,
                        Headers = partitionMigrationHeaders,
                        ResponseBody = new MemoryStream(FaultInjectionResponseEncoding.GetBytes($"Fault Injection Server Error: Partition Migrating, rule: {ruleId}"))
                    };
                    
                    return storeResponse;

                case FaultInjectionServerErrorType.PartitionIsSplitting:
                    INameValueCollection partitionSplitting = args.RequestHeaders;
                    partitionSplitting.Set(WFConstants.BackendHeaders.SubStatus, ((int)SubStatusCodes.CompletingSplit).ToString(CultureInfo.InvariantCulture));
                    partitionSplitting.Set(WFConstants.BackendHeaders.LocalLSN, lsn);

                    storeResponse = new StoreResponse()
                    {
                        Status = 410,
                        Headers = partitionSplitting,
                        ResponseBody = new MemoryStream(FaultInjectionResponseEncoding.GetBytes($"Fault Injection Server Error: Partition Splitting, rule: {ruleId}"))
                    };

                    return storeResponse;
                case FaultInjectionServerErrorType.ServiceUnavailable:
                    INameValueCollection serviceUnavailableHeaders = args.RequestHeaders;
                    serviceUnavailableHeaders.Set(WFConstants.BackendHeaders.LocalLSN, lsn);

                    storeResponse = new StoreResponse()
                    {
                        Status = 503,
                        Headers = serviceUnavailableHeaders,
                        ResponseBody = new MemoryStream(FaultInjectionResponseEncoding.GetBytes($"Fault Injection Server Error: Service Unavailable, rule: {ruleId}"))
                    };

                    return storeResponse;

                default:
                    throw new ArgumentException($"Server error type {this.serverErrorType} is not supported");
            }
        }