diff --git a/components/nexusoperations/workflow/commands.go b/components/nexusoperations/workflow/commands.go index 07e00d0baa7..8bb59fea126 100644 --- a/components/nexusoperations/workflow/commands.go +++ b/components/nexusoperations/workflow/commands.go @@ -109,9 +109,12 @@ func (ch *commandHandler) HandleScheduleCommand( } headerLength := 0 + lowerCaseHeader := make(map[string]string, len(attrs.NexusHeader)) for k, v := range attrs.NexusHeader { - headerLength += len(k) + len(v) - if slices.Contains(ch.config.DisallowedOperationHeaders(), strings.ToLower(k)) { + lowerK := strings.ToLower(k) + lowerCaseHeader[lowerK] = v + headerLength += len(lowerK) + len(v) + if slices.Contains(ch.config.DisallowedOperationHeaders(), lowerK) { return workflow.FailWorkflowTaskError{ Cause: enumspb.WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_NEXUS_OPERATION_ATTRIBUTES, Message: fmt.Sprintf("ScheduleNexusOperationCommandAttributes.NexusHeader contains a disallowed header key: %q", k), @@ -158,7 +161,7 @@ func (ch *commandHandler) HandleScheduleCommand( Operation: attrs.Operation, Input: attrs.Input, ScheduleToCloseTimeout: attrs.ScheduleToCloseTimeout, - NexusHeader: attrs.NexusHeader, + NexusHeader: lowerCaseHeader, RequestId: uuid.NewString(), WorkflowTaskCompletedEventId: workflowTaskCompletedEventID, }, diff --git a/service/frontend/workflow_handler.go b/service/frontend/workflow_handler.go index 476ff6426b4..a6a96cd779b 100644 --- a/service/frontend/workflow_handler.go +++ b/service/frontend/workflow_handler.go @@ -5200,8 +5200,10 @@ func (wh *WorkflowHandler) validateWorkflowCompletionCallbacks( } headerSize := 0 + lowerCaseHeaders := make(map[string]string, len(cb.Nexus.GetHeader())) for k, v := range cb.Nexus.GetHeader() { headerSize += len(k) + len(v) + lowerCaseHeaders[strings.ToLower(k)] = v } if headerSize > wh.config.CallbackHeaderMaxSize(ns.String()) { return status.Error( @@ -5212,6 +5214,7 @@ func (wh *WorkflowHandler) validateWorkflowCompletionCallbacks( ), ) } + cb.Nexus.Header = lowerCaseHeaders case *commonpb.Callback_Internal_: // TODO(Tianyu): For now, there is nothing to validate given that this is an internal field. continue