...

Source file src/github.com/docker/distribution/registry/api/v2/headerparser_test.go

Documentation: github.com/docker/distribution/registry/api/v2

     1  package v2
     2  
     3  import (
     4  	"testing"
     5  )
     6  
     7  func TestParseForwardedHeader(t *testing.T) {
     8  	for _, tc := range []struct {
     9  		name          string
    10  		raw           string
    11  		expected      map[string]string
    12  		expectedRest  string
    13  		expectedError bool
    14  	}{
    15  		{
    16  			name: "empty",
    17  			raw:  "",
    18  		},
    19  		{
    20  			name:     "one pair",
    21  			raw:      " key = value ",
    22  			expected: map[string]string{"key": "value"},
    23  		},
    24  		{
    25  			name:     "two pairs",
    26  			raw:      " key1 = value1; key2=value2",
    27  			expected: map[string]string{"key1": "value1", "key2": "value2"},
    28  		},
    29  		{
    30  			name:     "uppercase parameter",
    31  			raw:      "KeY=VaL",
    32  			expected: map[string]string{"key": "VaL"},
    33  		},
    34  		{
    35  			name:     "missing key=value pair - be tolerant",
    36  			raw:      "key=val;",
    37  			expected: map[string]string{"key": "val"},
    38  		},
    39  		{
    40  			name:     "quoted values",
    41  			raw:      `key="val";param = "[[ $((1 + 1)) == 3 ]] && echo panic!;" ; p=" abcd "`,
    42  			expected: map[string]string{"key": "val", "param": "[[ $((1 + 1)) == 3 ]] && echo panic!;", "p": " abcd "},
    43  		},
    44  		{
    45  			name:     "empty quoted value",
    46  			raw:      `key=""`,
    47  			expected: map[string]string{"key": ""},
    48  		},
    49  		{
    50  			name:     "quoted double quotes",
    51  			raw:      `key="\"value\""`,
    52  			expected: map[string]string{"key": `"value"`},
    53  		},
    54  		{
    55  			name:     "quoted backslash",
    56  			raw:      `key="\"\\\""`,
    57  			expected: map[string]string{"key": `"\"`},
    58  		},
    59  		{
    60  			name:         "ignore subsequent elements",
    61  			raw:          "key=a, param= b",
    62  			expected:     map[string]string{"key": "a"},
    63  			expectedRest: " param= b",
    64  		},
    65  		{
    66  			name:         "empty element - be tolerant",
    67  			raw:          " , key=val",
    68  			expectedRest: " key=val",
    69  		},
    70  		{
    71  			name:     "obscure key",
    72  			raw:      `ob₷C&r€ = value`,
    73  			expected: map[string]string{`ob₷c&r€`: "value"},
    74  		},
    75  		{
    76  			name:          "duplicate parameter",
    77  			raw:           "key=a; p=b; key=c",
    78  			expectedError: true,
    79  		},
    80  		{
    81  			name:          "empty parameter",
    82  			raw:           "=value",
    83  			expectedError: true,
    84  		},
    85  		{
    86  			name:          "empty value",
    87  			raw:           "key= ",
    88  			expectedError: true,
    89  		},
    90  		{
    91  			name:          "empty value before a new element ",
    92  			raw:           "key=,",
    93  			expectedError: true,
    94  		},
    95  		{
    96  			name:          "empty value before a new pair",
    97  			raw:           "key=;",
    98  			expectedError: true,
    99  		},
   100  		{
   101  			name:          "just parameter",
   102  			raw:           "key",
   103  			expectedError: true,
   104  		},
   105  		{
   106  			name:          "missing key-value",
   107  			raw:           "a=b;;",
   108  			expectedError: true,
   109  		},
   110  		{
   111  			name:          "unclosed quoted value",
   112  			raw:           `key="value`,
   113  			expectedError: true,
   114  		},
   115  		{
   116  			name:          "escaped terminating dquote",
   117  			raw:           `key="value\"`,
   118  			expectedError: true,
   119  		},
   120  		{
   121  			name:          "just a quoted value",
   122  			raw:           `"key=val"`,
   123  			expectedError: true,
   124  		},
   125  		{
   126  			name:          "quoted key",
   127  			raw:           `"key"=val`,
   128  			expectedError: true,
   129  		},
   130  	} {
   131  		parsed, rest, err := parseForwardedHeader(tc.raw)
   132  		if err != nil && !tc.expectedError {
   133  			t.Errorf("[%s] got unexpected error: %v", tc.name, err)
   134  		}
   135  		if err == nil && tc.expectedError {
   136  			t.Errorf("[%s] got unexpected non-error", tc.name)
   137  		}
   138  		if err != nil || tc.expectedError {
   139  			continue
   140  		}
   141  		for key, value := range tc.expected {
   142  			v, exists := parsed[key]
   143  			if !exists {
   144  				t.Errorf("[%s] missing expected parameter %q", tc.name, key)
   145  				continue
   146  			}
   147  			if v != value {
   148  				t.Errorf("[%s] got unexpected value for parameter %q: %q != %q", tc.name, key, v, value)
   149  			}
   150  		}
   151  		for key, value := range parsed {
   152  			if _, exists := tc.expected[key]; !exists {
   153  				t.Errorf("[%s] got unexpected key/value pair: %q=%q", tc.name, key, value)
   154  			}
   155  		}
   156  
   157  		if rest != tc.expectedRest {
   158  			t.Errorf("[%s] got unexpected unparsed string: %q != %q", tc.name, rest, tc.expectedRest)
   159  		}
   160  	}
   161  }
   162  

View as plain text