{"record":{"id":"58b22c252f9039a0","repo":"dotnet/yarp","slug":"headername-cannot-be-null-or-empty-58b22c","errorCode":null,"errorMessage":"'headerName' cannot be null or empty.","messagePattern":"'headerName' cannot be null or empty\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/ReverseProxy/Transforms/RequestHeaderXForwardedPrefixTransform.cs","lineNumber":20,"sourceCode":"// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\nusing System.Diagnostics;\nusing System.Threading.Tasks;\nusing Microsoft.Extensions.Primitives;\n\nnamespace Yarp.ReverseProxy.Transforms;\n\n/// <summary>\n/// Sets or appends the X-Forwarded-Prefix header with the request's original PathBase.\n/// </summary>\npublic class RequestHeaderXForwardedPrefixTransform : RequestTransform\n{\n    public RequestHeaderXForwardedPrefixTransform(string headerName, ForwardedTransformActions action)\n    {\n        if (string.IsNullOrEmpty(headerName))\n        {\n            throw new ArgumentException($\"'{nameof(headerName)}' cannot be null or empty.\", nameof(headerName));\n        }\n\n        HeaderName = headerName;\n        Debug.Assert(action != ForwardedTransformActions.Off);\n        TransformAction = action;\n    }\n\n    internal string HeaderName { get; }\n    internal ForwardedTransformActions TransformAction { get; }\n\n    /// <inheritdoc/>\n    public override ValueTask ApplyAsync(RequestTransformContext context)\n    {\n        ArgumentNullException.ThrowIfNull(context);\n\n        var pathBase = context.HttpContext.Request.PathBase;\n\n        switch (TransformAction)","sourceCodeStart":2,"sourceCodeEnd":38,"githubUrl":"https://github.com/dotnet/yarp/blob/bd11867bee7df522e7fd3effb08a9c85fd616908/src/ReverseProxy/Transforms/RequestHeaderXForwardedPrefixTransform.cs#L2-L38","documentation":"RequestHeaderXForwardedPrefixTransform's constructor rejects a null/empty headerName with ArgumentException. The transform sets/appends the request's original PathBase into the named header (e.g. X-Forwarded-Prefix), so the header name is mandatory. A Debug.Assert ensures the action is not Off.","triggerScenarios":"Calling `new RequestHeaderXForwardedPrefixTransform(headerName, action)` where headerName is null or empty. Hit through a custom factory or AddTransform callback that passes an empty name.","commonSituations":"Programmatic transform registration with an empty header-name variable; a config-driven custom factory emitting a blank name; refactoring that introduced a null.","solutions":["Supply a concrete header name like \"X-Forwarded-Prefix\".","Ensure the value comes from a non-empty config/source.","Validate before constructing."],"exampleFix":"// before\nnew RequestHeaderXForwardedPrefixTransform(null, ForwardedTransformActions.Append);\n// after\nnew RequestHeaderXForwardedPrefixTransform(\"X-Forwarded-Prefix\", ForwardedTransformActions.Append);","handlingStrategy":"validation","validationCode":"if (string.IsNullOrEmpty(headerName))\n    headerName = \"X-Forwarded-Prefix\";\nvar t = new RequestHeaderXForwardedPrefixTransform(headerName, action);","typeGuard":"static bool IsValidHeaderName(string? name)\n    => !string.IsNullOrWhiteSpace(name);","tryCatchPattern":null,"preventionTips":["Use the forwarded-prefix extension methods that supply conventional names.","Default to X-Forwarded-Prefix when the value is empty.","Validate in custom factory code before constructing."],"tags":["yarp","transforms","argument-validation","headers","forwarded"],"backgroundTag":null,"analyzedSha":"bd11867bee7df522e7fd3effb08a9c85fd616908","analyzedAt":"2026-08-13T21:29:49.359Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}