diff --git a/generators/csharp/dynamic-snippets/src/EndpointSnippetGenerator.ts b/generators/csharp/dynamic-snippets/src/EndpointSnippetGenerator.ts index c2d688f73cae..5561bf9923fc 100644 --- a/generators/csharp/dynamic-snippets/src/EndpointSnippetGenerator.ts +++ b/generators/csharp/dynamic-snippets/src/EndpointSnippetGenerator.ts @@ -385,16 +385,24 @@ export class EndpointSnippetGenerator extends WithGeneration { auth: FernIr.dynamic.BasicAuth; values: FernIr.dynamic.BasicAuthValues; }): NamedArgument[] { - return [ - { + // usernameOmit/passwordOmit may exist in newer IR versions + const authRecord = auth as unknown as Record; + const usernameOmitted = !!authRecord.usernameOmit; + const passwordOmitted = !!authRecord.passwordOmit; + const args: NamedArgument[] = []; + if (!usernameOmitted) { + args.push({ name: this.context.getParameterName(auth.username), assignment: this.csharp.Literal.string(values.username) - }, - { + }); + } + if (!passwordOmitted) { + args.push({ name: this.context.getParameterName(auth.password), assignment: this.csharp.Literal.string(values.password) - } - ]; + }); + } + return args; } private getConstructorBearerAuthArgs({ diff --git a/generators/csharp/sdk/src/root-client/RootClientGenerator.ts b/generators/csharp/sdk/src/root-client/RootClientGenerator.ts index f5c8ed5cfa2a..4d6b0d3f19b6 100644 --- a/generators/csharp/sdk/src/root-client/RootClientGenerator.ts +++ b/generators/csharp/sdk/src/root-client/RootClientGenerator.ts @@ -454,6 +454,7 @@ export class RootClientGenerator extends FileGenerator s.type === "basic" ); const isAuthOptional = !this.context.ir.sdkConfig.isAuthMandatory; + let isFirstBlock = true; for (let i = 0; i < basicSchemes.length; i++) { const basicScheme = basicSchemes[i]; if (basicScheme == null) { @@ -467,15 +468,30 @@ export class RootClientGenerator extends FileGenerator 1) { - const controlFlowKeyword = i === 0 ? "if" : "else if"; - innerWriter.controlFlow( - controlFlowKeyword, - this.csharp.codeblock(`${usernameAccess} != null && ${passwordAccess} != null`) - ); + const controlFlowKeyword = isFirstBlock ? "if" : "else if"; + innerWriter.controlFlow(controlFlowKeyword, this.csharp.codeblock(condition)); } + isFirstBlock = false; + // Build credential string: omitted fields are empty, provided fields use interpolation + const usernamePart = usernameOmitted ? "" : `{${usernameAccess}}`; + const passwordPart = passwordOmitted ? "" : `{${passwordAccess}}`; innerWriter.writeTextStatement( - `clientOptionsWithAuth.Headers["Authorization"] = $"Basic {Convert.ToBase64String(global::System.Text.Encoding.UTF8.GetBytes($"{${usernameAccess}}:{${passwordAccess}}"))}"` + `clientOptionsWithAuth.Headers["Authorization"] = $"Basic {Convert.ToBase64String(global::System.Text.Encoding.UTF8.GetBytes($"${usernamePart}:${passwordPart}"))}"` ); if (isAuthOptional || basicSchemes.length > 1) { innerWriter.endControlFlow(); @@ -802,8 +818,12 @@ export class RootClientGenerator extends FileGenerator() { { "key", "value" } } ); diff --git a/seed/csharp-sdk/basic-auth-pw-omitted/snippet.json b/seed/csharp-sdk/basic-auth-pw-omitted/snippet.json index d34d7ff2de39..4c3ff1f75316 100644 --- a/seed/csharp-sdk/basic-auth-pw-omitted/snippet.json +++ b/seed/csharp-sdk/basic-auth-pw-omitted/snippet.json @@ -10,7 +10,7 @@ }, "snippet": { "type": "csharp", - "client": "using SeedBasicAuthPwOmitted;\n\nvar client = new SeedBasicAuthPwOmittedClient(\"USERNAME\", \"PASSWORD\");\nawait client.BasicAuth.GetWithBasicAuthAsync();\n" + "client": "using SeedBasicAuthPwOmitted;\n\nvar client = new SeedBasicAuthPwOmittedClient(\"USERNAME\");\nawait client.BasicAuth.GetWithBasicAuthAsync();\n" } }, { @@ -22,7 +22,7 @@ }, "snippet": { "type": "csharp", - "client": "using SeedBasicAuthPwOmitted;\n\nvar client = new SeedBasicAuthPwOmittedClient(\"USERNAME\", \"PASSWORD\");\nawait client.BasicAuth.PostWithBasicAuthAsync(\n new Dictionary() { { \"key\", \"value\" } }\n);\n" + "client": "using SeedBasicAuthPwOmitted;\n\nvar client = new SeedBasicAuthPwOmittedClient(\"USERNAME\");\nawait client.BasicAuth.PostWithBasicAuthAsync(\n new Dictionary() { { \"key\", \"value\" } }\n);\n" } } ] diff --git a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example0.cs b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example0.cs index 0386a3aae32d..6f9ff23cec7b 100644 --- a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example0.cs +++ b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example0.cs @@ -7,7 +7,6 @@ public class Example0 public async Task Do() { var client = new SeedBasicAuthPwOmittedClient( username: "", - password: "", clientOptions: new ClientOptions { BaseUrl = "https://api.fern.com" } diff --git a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example1.cs b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example1.cs index 1350c4c8bf5f..24c9405b59dc 100644 --- a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example1.cs +++ b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example1.cs @@ -7,7 +7,6 @@ public class Example1 public async Task Do() { var client = new SeedBasicAuthPwOmittedClient( username: "", - password: "", clientOptions: new ClientOptions { BaseUrl = "https://api.fern.com" } diff --git a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example2.cs b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example2.cs index 18153656c351..5d43ecab4c89 100644 --- a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example2.cs +++ b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example2.cs @@ -7,7 +7,6 @@ public class Example2 public async Task Do() { var client = new SeedBasicAuthPwOmittedClient( username: "", - password: "", clientOptions: new ClientOptions { BaseUrl = "https://api.fern.com" } diff --git a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example3.cs b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example3.cs index f87705f66997..a2e5fde81c6b 100644 --- a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example3.cs +++ b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example3.cs @@ -7,7 +7,6 @@ public class Example3 public async Task Do() { var client = new SeedBasicAuthPwOmittedClient( username: "", - password: "", clientOptions: new ClientOptions { BaseUrl = "https://api.fern.com" } diff --git a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example4.cs b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example4.cs index 6830ffefd31d..e78f2c1fc3e5 100644 --- a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example4.cs +++ b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example4.cs @@ -7,7 +7,6 @@ public class Example4 public async Task Do() { var client = new SeedBasicAuthPwOmittedClient( username: "", - password: "", clientOptions: new ClientOptions { BaseUrl = "https://api.fern.com" } diff --git a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example5.cs b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example5.cs index e72d56e4a6ae..d1c8a33d91ea 100644 --- a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example5.cs +++ b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example5.cs @@ -7,7 +7,6 @@ public class Example5 public async Task Do() { var client = new SeedBasicAuthPwOmittedClient( username: "", - password: "", clientOptions: new ClientOptions { BaseUrl = "https://api.fern.com" } diff --git a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example6.cs b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example6.cs index 575b1b09bc67..a22fa62a1000 100644 --- a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example6.cs +++ b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedApi.DynamicSnippets/Example6.cs @@ -7,7 +7,6 @@ public class Example6 public async Task Do() { var client = new SeedBasicAuthPwOmittedClient( username: "", - password: "", clientOptions: new ClientOptions { BaseUrl = "https://api.fern.com" } diff --git a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedBasicAuthPwOmitted.Test/Unit/MockServer/BaseMockServerTest.cs b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedBasicAuthPwOmitted.Test/Unit/MockServer/BaseMockServerTest.cs index 5e326bfd0150..b1ba88a9f60d 100644 --- a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedBasicAuthPwOmitted.Test/Unit/MockServer/BaseMockServerTest.cs +++ b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedBasicAuthPwOmitted.Test/Unit/MockServer/BaseMockServerTest.cs @@ -25,7 +25,6 @@ public void GlobalSetup() // Initialize the Client Client = new SeedBasicAuthPwOmittedClient( "USERNAME", - "PASSWORD", clientOptions: new ClientOptions { BaseUrl = Server.Urls[0], MaxRetries = 0 } ); } diff --git a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedBasicAuthPwOmitted/SeedBasicAuthPwOmittedClient.cs b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedBasicAuthPwOmitted/SeedBasicAuthPwOmittedClient.cs index 7983d9e6046d..9ceaa24c808a 100644 --- a/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedBasicAuthPwOmitted/SeedBasicAuthPwOmittedClient.cs +++ b/seed/csharp-sdk/basic-auth-pw-omitted/src/SeedBasicAuthPwOmitted/SeedBasicAuthPwOmittedClient.cs @@ -8,7 +8,6 @@ public partial class SeedBasicAuthPwOmittedClient : ISeedBasicAuthPwOmittedClien public SeedBasicAuthPwOmittedClient( string? username = null, - string? password = null, ClientOptions? clientOptions = null ) { @@ -31,7 +30,7 @@ public SeedBasicAuthPwOmittedClient( } var clientOptionsWithAuth = clientOptions.Clone(); clientOptionsWithAuth.Headers["Authorization"] = - $"Basic {Convert.ToBase64String(global::System.Text.Encoding.UTF8.GetBytes($"{username}:{password}"))}"; + $"Basic {Convert.ToBase64String(global::System.Text.Encoding.UTF8.GetBytes($"{username}:"))}"; _client = new RawClient(clientOptionsWithAuth); BasicAuth = new BasicAuthClient(_client); }