github.com/geraldss/go/src@v0.0.0-20210511222824-ac7d0ebfc235/html/template/url_test.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package template 6 7 import ( 8 "testing" 9 ) 10 11 func TestURLNormalizer(t *testing.T) { 12 tests := []struct { 13 url, want string 14 }{ 15 {"", ""}, 16 { 17 "http://example.com:80/foo/bar?q=foo%20&bar=x+y#frag", 18 "http://example.com:80/foo/bar?q=foo%20&bar=x+y#frag", 19 }, 20 {" ", "%20"}, 21 {"%7c", "%7c"}, 22 {"%7C", "%7C"}, 23 {"%2", "%252"}, 24 {"%", "%25"}, 25 {"%z", "%25z"}, 26 {"/foo|bar/%5c\u1234", "/foo%7cbar/%5c%e1%88%b4"}, 27 } 28 for _, test := range tests { 29 if got := urlNormalizer(test.url); test.want != got { 30 t.Errorf("%q: want\n\t%q\nbut got\n\t%q", test.url, test.want, got) 31 } 32 if test.want != urlNormalizer(test.want) { 33 t.Errorf("not idempotent: %q", test.want) 34 } 35 } 36 } 37 38 func TestURLFilters(t *testing.T) { 39 input := ("\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f" + 40 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + 41 ` !"#$%&'()*+,-./` + 42 `0123456789:;<=>?` + 43 `@ABCDEFGHIJKLMNO` + 44 `PQRSTUVWXYZ[\]^_` + 45 "`abcdefghijklmno" + 46 "pqrstuvwxyz{|}~\x7f" + 47 "\u00A0\u0100\u2028\u2029\ufeff\U0001D11E") 48 49 tests := []struct { 50 name string 51 escaper func(...interface{}) string 52 escaped string 53 }{ 54 { 55 "urlEscaper", 56 urlEscaper, 57 "%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f" + 58 "%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f" + 59 "%20%21%22%23%24%25%26%27%28%29%2a%2b%2c-.%2f" + 60 "0123456789%3a%3b%3c%3d%3e%3f" + 61 "%40ABCDEFGHIJKLMNO" + 62 "PQRSTUVWXYZ%5b%5c%5d%5e_" + 63 "%60abcdefghijklmno" + 64 "pqrstuvwxyz%7b%7c%7d~%7f" + 65 "%c2%a0%c4%80%e2%80%a8%e2%80%a9%ef%bb%bf%f0%9d%84%9e", 66 }, 67 { 68 "urlNormalizer", 69 urlNormalizer, 70 "%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f" + 71 "%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f" + 72 "%20!%22#$%25&%27%28%29*+,-./" + 73 "0123456789:;%3c=%3e?" + 74 "@ABCDEFGHIJKLMNO" + 75 "PQRSTUVWXYZ[%5c]%5e_" + 76 "%60abcdefghijklmno" + 77 "pqrstuvwxyz%7b%7c%7d~%7f" + 78 "%c2%a0%c4%80%e2%80%a8%e2%80%a9%ef%bb%bf%f0%9d%84%9e", 79 }, 80 } 81 82 for _, test := range tests { 83 if s := test.escaper(input); s != test.escaped { 84 t.Errorf("%s: want\n\t%q\ngot\n\t%q", test.name, test.escaped, s) 85 continue 86 } 87 } 88 } 89 90 func TestSrcsetFilter(t *testing.T) { 91 tests := []struct { 92 name string 93 input string 94 want string 95 }{ 96 { 97 "one ok", 98 "http://example.com/img.png", 99 "http://example.com/img.png", 100 }, 101 { 102 "one ok with metadata", 103 " /img.png 200w", 104 " /img.png 200w", 105 }, 106 { 107 "one bad", 108 "javascript:alert(1) 200w", 109 "#ZgotmplZ", 110 }, 111 { 112 "two ok", 113 "foo.png, bar.png", 114 "foo.png, bar.png", 115 }, 116 { 117 "left bad", 118 "javascript:alert(1), /foo.png", 119 "#ZgotmplZ, /foo.png", 120 }, 121 { 122 "right bad", 123 "/bogus#, javascript:alert(1)", 124 "/bogus#,#ZgotmplZ", 125 }, 126 } 127 128 for _, test := range tests { 129 if got := srcsetFilterAndEscaper(test.input); got != test.want { 130 t.Errorf("%s: srcsetFilterAndEscaper(%q) want %q != %q", test.name, test.input, test.want, got) 131 } 132 } 133 } 134 135 func BenchmarkURLEscaper(b *testing.B) { 136 for i := 0; i < b.N; i++ { 137 urlEscaper("http://example.com:80/foo?q=bar%20&baz=x+y#frag") 138 } 139 } 140 141 func BenchmarkURLEscaperNoSpecials(b *testing.B) { 142 for i := 0; i < b.N; i++ { 143 urlEscaper("TheQuickBrownFoxJumpsOverTheLazyDog.") 144 } 145 } 146 147 func BenchmarkURLNormalizer(b *testing.B) { 148 for i := 0; i < b.N; i++ { 149 urlNormalizer("The quick brown fox jumps over the lazy dog.\n") 150 } 151 } 152 153 func BenchmarkURLNormalizerNoSpecials(b *testing.B) { 154 for i := 0; i < b.N; i++ { 155 urlNormalizer("http://example.com:80/foo?q=bar%20&baz=x+y#frag") 156 } 157 } 158 159 func BenchmarkSrcsetFilter(b *testing.B) { 160 for i := 0; i < b.N; i++ { 161 srcsetFilterAndEscaper(" /foo/bar.png 200w, /baz/boo(1).png") 162 } 163 } 164 165 func BenchmarkSrcsetFilterNoSpecials(b *testing.B) { 166 for i := 0; i < b.N; i++ { 167 srcsetFilterAndEscaper("http://example.com:80/foo?q=bar%20&baz=x+y#frag") 168 } 169 }