{"record":{"id":"c6a74f9c74e72f57","repo":"dotnet/yarp","slug":"headername-cannot-be-null-or-empty-c6a74f","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/RequestHeaderXForwardedProtoTransform.cs","lineNumber":25,"sourceCode":"using Microsoft.Extensions.Primitives;\n\nnamespace Yarp.ReverseProxy.Transforms;\n\n/// <summary>\n/// Sets or appends the X-Forwarded-Proto header with the request's original url scheme.\n/// </summary>\npublic class RequestHeaderXForwardedProtoTransform : RequestTransform\n{\n    /// <summary>\n    /// Creates a new transform.\n    /// </summary>\n    /// <param name=\"headerName\">The header name.</param>\n    /// <param name=\"action\">Action to applied to the header.</param>\n    public RequestHeaderXForwardedProtoTransform(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 scheme = context.HttpContext.Request.Scheme;\n\n        switch (TransformAction)","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/dotnet/yarp/blob/bd11867bee7df522e7fd3effb08a9c85fd616908/src/ReverseProxy/Transforms/RequestHeaderXForwardedProtoTransform.cs#L7-L43","documentation":"RequestHeaderXForwardedProtoTransform's constructor throws ArgumentException when headerName is null or empty. The transform writes the request scheme (http/https) into a forwarded header such as X-Forwarded-Proto, so the target header name is required. A Debug.Assert also guards that action is not Off.","triggerScenarios":"Constructing `new RequestHeaderXForwardedProtoTransform(headerName, action)` with a null/empty headerName. Encountered via a custom factory or programmatic AddTransform with an empty name.","commonSituations":"Uninitialised header-name variable in a custom transform setup; config extension passing an empty string; refactoring oversight.","solutions":["Pass a real header name, e.g. \"X-Forwarded-Proto\".","Source the name from a non-empty config value.","Guard the construction call site."],"exampleFix":"// before\nnew RequestHeaderXForwardedProtoTransform(\"\", ForwardedTransformActions.Set);\n// after\nnew RequestHeaderXForwardedProtoTransform(\"X-Forwarded-Proto\", ForwardedTransformActions.Set);","handlingStrategy":"validation","validationCode":"if (string.IsNullOrEmpty(headerName))\n    headerName = \"X-Forwarded-Proto\";\nvar t = new RequestHeaderXForwardedProtoTransform(headerName, action);","typeGuard":"static bool IsValidHeaderName(string? name)\n    => !string.IsNullOrWhiteSpace(name);","tryCatchPattern":null,"preventionTips":["Use the forwarded-proto extension methods with conventional names.","Default to X-Forwarded-Proto when the source value is empty.","Validate header names before constructing in custom factory code."],"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"}