diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs index 2ed3406ed73..832dc6d83c6 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs @@ -859,7 +859,7 @@ private static List GetSuccessStatusCodes(InputOperation operation) foreach (var statusCode in response.StatusCodes) { - if (statusCode >= 200 && statusCode < 300) + if (statusCode >= 200 && statusCode < 400) { statusCodes.Add(statusCode); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/RestClientProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/RestClientProviderTests.cs index 57185131052..a563b215820 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/RestClientProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/RestClientProviderTests.cs @@ -102,6 +102,66 @@ public void ValidateProperties() Assert.IsFalse(propertyHash.ContainsKey("PipelineMessageClassifier204")); } + [Test] + public void Validate3xxRedirectStatusCode() + { + // Test that 3xx status codes (like 302 redirect) are handled correctly + var inputServiceMethod = InputFactory.BasicServiceMethod( + "TestRedirect", + InputFactory.Operation( + "Redirect302", + responses: + [ + InputFactory.OperationResponse( + statusCodes: [302], + headers: + [ + new InputOperationResponseHeader( + "location", + "location", + "Location header for redirect", + null, + InputPrimitiveType.String) + ]) + ])); + + var inputClient = InputFactory.Client("TestClient", methods: [inputServiceMethod]); + var clientProvider = new ClientProvider(inputClient); + var restClient = clientProvider.RestClient; + + Assert.IsNotNull(restClient); + + // Validate that the classifier for 302 status code exists + Dictionary propertyHash = restClient.Properties.ToDictionary(p => p.Name); + Assert.IsTrue(propertyHash.ContainsKey("PipelineMessageClassifier302"), + "PipelineMessageClassifier302 should be present for 302 redirect"); + + var pipelineMessageClassifier302 = propertyHash["PipelineMessageClassifier302"]; + Assert.AreEqual("PipelineMessageClassifier", pipelineMessageClassifier302.Type.Name); + Assert.AreEqual("PipelineMessageClassifier302", pipelineMessageClassifier302.Name); + Assert.AreEqual(MethodSignatureModifiers.Private | MethodSignatureModifiers.Static, pipelineMessageClassifier302.Modifiers); + + // Validate that fields are created correctly + Dictionary fieldHash = restClient.Fields.ToDictionary(f => f.Name); + Assert.IsTrue(fieldHash.ContainsKey("_pipelineMessageClassifier302"), + "_pipelineMessageClassifier302 field should be present for 302 redirect"); + + var pipelineMessageClassifier302Field = fieldHash["_pipelineMessageClassifier302"]; + Assert.AreEqual("PipelineMessageClassifier", pipelineMessageClassifier302Field.Type.Name); + Assert.AreEqual("_pipelineMessageClassifier302", pipelineMessageClassifier302Field.Name); + Assert.AreEqual(FieldModifiers.Private | FieldModifiers.Static, pipelineMessageClassifier302Field.Modifiers); + + // Validate that the CreateRequest method uses the classifier + var createRequestMethod = restClient.Methods.FirstOrDefault(m => m.Signature.Name == "CreateRedirect302Request"); + Assert.IsNotNull(createRequestMethod, "CreateRedirect302Request method should exist"); + + var bodyStatements = createRequestMethod?.BodyStatements as MethodBodyStatements; + Assert.IsNotNull(bodyStatements, "Method body statements should not be null"); + + // Verify that the classifier property is referenced in the CreateRequest method body + ValidateResponseClassifier(bodyStatements!, "302"); + } + [TestCaseSource(nameof(GetMethodParametersTestCases))] public void TestGetMethodParameters(InputServiceMethod inputServiceMethod) {