{"record":{"id":"a6a068208868ac9d","repo":"dotnet/yarp","slug":"headername-cannot-be-null-or-empty-a6a068","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/RequestHeaderRemoveTransform.cs","lineNumber":18,"sourceCode":"// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\nusing System.Threading.Tasks;\n\nnamespace Yarp.ReverseProxy.Transforms;\n\n/// <summary>\n/// Removes a request header.\n/// </summary>\npublic class RequestHeaderRemoveTransform : RequestTransform\n{\n    public RequestHeaderRemoveTransform(string headerName)\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    }\n\n    internal string HeaderName { get; }\n\n    /// <inheritdoc/>\n    public override ValueTask ApplyAsync(RequestTransformContext context)\n    {\n        ArgumentNullException.ThrowIfNull(context);\n\n        RemoveHeader(context, HeaderName);\n\n        return default;\n    }\n}\n","sourceCodeStart":1,"sourceCodeEnd":36,"githubUrl":"https://github.com/dotnet/yarp/blob/bd11867bee7df522e7fd3effb08a9c85fd616908/src/ReverseProxy/Transforms/RequestHeaderRemoveTransform.cs#L1-L36","documentation":"RequestHeaderRemoveTransform's constructor throws ArgumentException when headerName is null or empty. The transform removes a named request header, so it must know which header to target; an empty name has no valid meaning.","triggerScenarios":"Constructing `new RequestHeaderRemoveTransform(headerName)` with a null/empty string. Reaches this constructor through context.AddRequestHeaderRemove when a config transform supplies an empty 'RequestHeaderRemove' value.","commonSituations":"Config entry `{ \"RequestHeaderRemove\": \"\" }`; a programmatic AddTransform using an uninitialised variable; a dynamic header list that yields an empty entry.","solutions":["Supply a real header name, e.g. \"X-Unwanted-Header\".","Fix the config so the RequestHeaderRemove value is non-empty.","Filter empty strings out of dynamically generated header names before constructing."],"exampleFix":"// before\n{ \"RequestHeaderRemove\": \"\" }\n// after\n{ \"RequestHeaderRemove\": \"X-Unwanted-Header\" }","handlingStrategy":"validation","validationCode":"if (string.IsNullOrEmpty(headerName))\n    throw new InvalidOperationException(\"Cannot remove a header without a name.\");\nvar transform = new RequestHeaderRemoveTransform(headerName);","typeGuard":"static bool IsValidHeaderName(string? name)\n    => !string.IsNullOrWhiteSpace(name);","tryCatchPattern":null,"preventionTips":["Filter empty entries out of dynamic header-name lists before constructing transforms.","Validate config values are non-empty before they reach the transform pipeline.","Use context.AddRequestHeaderRemove from validated config rather than constructing directly."],"tags":["yarp","transforms","argument-validation","headers"],"backgroundTag":null,"analyzedSha":"bd11867bee7df522e7fd3effb08a9c85fd616908","analyzedAt":"2026-08-13T21:29:49.359Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}