@@ -21,6 +21,9 @@ interface IProps {
2121 subscriptionSettings : UpdateSubscriptionSettingsCommand . Response [ 'response' ]
2222}
2323
24+ const HEADER_NAME_REGEX = / ^ [ ! # $ % & ' * + \- . 0 - 9 A - Z ^ _ ` a - z | ~ ] + $ /
25+ const HEADER_VALUE_REGEX = / ^ [ \x21 - \x7E ] ( [ \x20 - \x7E ] * [ \x21 - \x7E ] ) ? $ /
26+
2427export const SubscriptionResponseHeadersCardWidget = ( props : IProps ) => {
2528 const { subscriptionSettings } = props
2629 const { t } = useTranslation ( )
@@ -61,17 +64,43 @@ export const SubscriptionResponseHeadersCardWidget = (props: IProps) => {
6164 } )
6265
6366 const handleSubmit = form . onSubmit ( ( values ) => {
64- const headersFiltered = headers . filter ( ( header ) => header . key . trim ( ) !== '' )
67+ const headersFiltered = headers
68+ . map ( ( header ) => ( {
69+ key : header . key . trim ( ) ,
70+ value : header . value . trim ( )
71+ } ) )
72+ . filter ( ( header ) => header . key !== '' )
73+
74+ const seen = new Set < string > ( )
75+ const uniqueHeaders : HeaderItem [ ] = [ ]
76+ for ( let i = headersFiltered . length - 1 ; i >= 0 ; i -- ) {
77+ const header = headersFiltered [ i ]
78+ if ( ! seen . has ( header . key ) ) {
79+ uniqueHeaders . unshift ( header )
80+ seen . add ( header . key )
81+ }
82+ }
83+
84+ for ( const header of uniqueHeaders ) {
85+ if ( ! HEADER_NAME_REGEX . test ( header . key ) ) {
86+ form . setFieldError ( 'customResponseHeaders' , `Invalid header name: ${ header . key } ` )
87+ return
88+ }
89+ if ( ! HEADER_VALUE_REGEX . test ( header . value ) ) {
90+ form . setFieldError ( 'customResponseHeaders' , `Invalid header value: ${ header . value } ` )
91+ return
92+ }
93+ }
6594
66- const customResponseHeaders : Record < string , string > = { }
67- headersFiltered . forEach ( ( header ) => {
68- customResponseHeaders [ header . key ] = header . value
95+ const responseHeaders : Record < string , string > = { }
96+ uniqueHeaders . forEach ( ( header ) => {
97+ responseHeaders [ header . key ] = header . value
6998 } )
7099
71100 mutate ( {
72101 variables : {
73102 uuid : values . uuid ,
74- customResponseHeaders
103+ customResponseHeaders : responseHeaders
75104 }
76105 } )
77106 } )
0 commit comments