From 9f7b8d4d803c0d03fb2f9e18d253298afb7f3996 Mon Sep 17 00:00:00 2001 From: Justine Alexandra Roberts Tunney Date: Fri, 10 Apr 2015 22:57:25 -0400 Subject: [PATCH] Clean up the URI parsing. --- sip/sip.rl | 2 +- sip/uri_parse.go | 1891 +++++++++++++++++++--------------------------- sip/uri_parse.rl | 92 ++- sip/uri_test.go | 10 +- 4 files changed, 847 insertions(+), 1148 deletions(-) diff --git a/sip/sip.rl b/sip/sip.rl index fabc4a8..1e6fb4f 100644 --- a/sip/sip.rl +++ b/sip/sip.rl @@ -367,7 +367,7 @@ quoted_content = ( qdtext | quoted_pair )* >start; quoted_string = DQUOTE quoted_content DQUOTE; unquoted_string = ( token LWS )+; -# Parameters can be used by vias and addresses. +# Parameters can be used by vias and addresses, but not URIs. param_name = token >mark %name; param_content = tokenhost @append; param_value = param_content | quoted_string; diff --git a/sip/uri_parse.go b/sip/uri_parse.go index 5c0ef45..2dc5041 100644 --- a/sip/uri_parse.go +++ b/sip/uri_parse.go @@ -44,27 +44,28 @@ func ParseURIBytes(data []byte) (uri *URI, err error) { eof := len(data) buf := make([]byte, len(data)) amt := 0 + // mark := 0 var b1, b2 string var hex byte -//line uri_parse.rl:149 +//line uri_parse.rl:171 -//line uri_parse.go:56 +//line uri_parse.go:57 { cs = uri_start } -//line uri_parse.rl:152 +//line uri_parse.rl:174 if bytes.IndexByte(data, '@') == -1 { cs = uri_en_uriSansUser; } else { cs = uri_en_uriWithUser; } -//line uri_parse.go:68 +//line uri_parse.go:69 { if p == pe { goto _test_eof @@ -96,139 +97,120 @@ func ParseURIBytes(data []byte) (uri *URI, err error) { goto st_case_11 case 45: goto st_case_45 - case 46: - goto st_case_46 case 12: goto st_case_12 - case 47: - goto st_case_47 + case 46: + goto st_case_46 case 13: goto st_case_13 + case 47: + goto st_case_47 case 14: goto st_case_14 case 15: goto st_case_15 - case 48: - goto st_case_48 case 16: goto st_case_16 + case 48: + goto st_case_48 case 17: goto st_case_17 case 18: goto st_case_18 - case 49: - goto st_case_49 - case 50: - goto st_case_50 case 19: goto st_case_19 + case 49: + goto st_case_49 case 20: goto st_case_20 case 21: goto st_case_21 - case 51: - goto st_case_51 case 22: goto st_case_22 + case 50: + goto st_case_50 case 23: goto st_case_23 case 24: goto st_case_24 - case 52: - goto st_case_52 case 25: goto st_case_25 case 26: goto st_case_26 - case 53: - goto st_case_53 + case 51: + goto st_case_51 case 27: goto st_case_27 case 28: goto st_case_28 case 29: goto st_case_29 - case 54: - goto st_case_54 - case 55: - goto st_case_55 + case 52: + goto st_case_52 case 30: goto st_case_30 - case 56: - goto st_case_56 + case 53: + goto st_case_53 case 31: goto st_case_31 + case 54: + goto st_case_54 case 32: goto st_case_32 case 33: goto st_case_33 - case 57: - goto st_case_57 case 34: goto st_case_34 + case 55: + goto st_case_55 case 35: goto st_case_35 case 36: goto st_case_36 - case 58: - goto st_case_58 - case 59: - goto st_case_59 case 37: goto st_case_37 + case 56: + goto st_case_56 case 38: goto st_case_38 case 39: goto st_case_39 - case 60: - goto st_case_60 case 40: goto st_case_40 + case 57: + goto st_case_57 case 41: goto st_case_41 case 42: goto st_case_42 - case 61: - goto st_case_61 case 43: goto st_case_43 case 44: goto st_case_44 - case 62: - goto st_case_62 + case 58: + goto st_case_58 } goto st_out - st1: - if p++; p == pe { - goto _test_eof1 - } st_case_1: - if data[p] == 32 { - goto st1 - } switch { - case data[p] < 65: - if 9 <= data[p] && data[p] <= 13 { - goto st1 - } case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr2 + goto tr0 } - default: - goto tr2 + case data[p] >= 65: + goto tr0 } goto st0 st_case_0: st0: cs = 0 goto _out -tr2: -//line uri_parse.rl:38 +tr0: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:87 +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -238,8 +220,8 @@ tr2: amt++ goto st2 -tr3: -//line uri_parse.rl:87 +tr2: +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -254,33 +236,33 @@ tr3: goto _test_eof2 } st_case_2: -//line uri_parse.go:258 +//line uri_parse.go:240 switch data[p] { case 43: - goto tr3 + goto tr2 case 58: - goto tr4 + goto tr3 } switch { case data[p] < 48: if 45 <= data[p] && data[p] <= 46 { - goto tr3 + goto tr2 } case data[p] > 57: switch { case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr3 + goto tr2 } case data[p] >= 65: - goto tr3 + goto tr2 } default: - goto tr3 + goto tr2 } goto st0 -tr4: -//line uri_parse.rl:57 +tr3: +//line uri_parse.rl:74 uri.Scheme = string(buf[0:amt]) @@ -290,56 +272,56 @@ tr4: goto _test_eof3 } st_case_3: -//line uri_parse.go:294 +//line uri_parse.go:276 switch data[p] { case 33: - goto tr5 + goto tr4 case 37: - goto tr6 - case 59: goto tr5 + case 59: + goto tr4 case 61: - goto tr5 + goto tr4 case 63: - goto tr5 + goto tr4 case 95: - goto tr5 + goto tr4 case 126: - goto tr5 + goto tr4 } switch { case data[p] < 65: if 36 <= data[p] && data[p] <= 57 { - goto tr5 + goto tr4 } case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr5 + goto tr4 } default: - goto tr5 + goto tr4 } goto st0 -tr5: -//line uri_parse.rl:38 +tr4: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:42 +//line uri_parse.rl:51 buf[amt] = data[p] amt++ goto st4 -tr7: -//line uri_parse.rl:42 +tr6: +//line uri_parse.rl:51 buf[amt] = data[p] amt++ goto st4 -tr12: -//line uri_parse.rl:51 +tr11: +//line uri_parse.rl:60 hex += unhex(data[p]) buf[amt] = hex @@ -351,38 +333,38 @@ tr12: goto _test_eof4 } st_case_4: -//line uri_parse.go:355 +//line uri_parse.go:337 switch data[p] { case 33: - goto tr7 + goto tr6 case 37: goto st5 case 58: - goto tr9 + goto tr8 case 61: - goto tr7 + goto tr6 case 64: - goto tr10 + goto tr9 case 95: - goto tr7 + goto tr6 case 126: - goto tr7 + goto tr6 } switch { case data[p] < 63: if 36 <= data[p] && data[p] <= 59 { - goto tr7 + goto tr6 } case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr7 + goto tr6 } default: - goto tr7 + goto tr6 } goto st0 -tr6: -//line uri_parse.rl:38 +tr5: +//line uri_parse.rl:47 amt = 0 @@ -392,22 +374,22 @@ tr6: goto _test_eof5 } st_case_5: -//line uri_parse.go:396 +//line uri_parse.go:378 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr11 + goto tr10 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr11 + goto tr10 } default: - goto tr11 + goto tr10 } goto st0 -tr11: -//line uri_parse.rl:47 +tr10: +//line uri_parse.rl:56 hex = unhex(data[p]) * 16 @@ -417,22 +399,22 @@ tr11: goto _test_eof6 } st_case_6: -//line uri_parse.go:421 +//line uri_parse.go:403 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr12 + goto tr11 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr12 + goto tr11 } default: - goto tr12 + goto tr11 } goto st0 -tr9: -//line uri_parse.rl:61 +tr8: +//line uri_parse.rl:78 uri.User = string(buf[0:amt]) @@ -442,57 +424,57 @@ tr9: goto _test_eof7 } st_case_7: -//line uri_parse.go:446 +//line uri_parse.go:428 switch data[p] { case 33: - goto tr13 + goto tr12 case 37: - goto tr14 - case 61: goto tr13 + case 61: + goto tr12 case 95: - goto tr13 + goto tr12 case 126: - goto tr13 + goto tr12 } switch { case data[p] < 48: if 36 <= data[p] && data[p] <= 46 { - goto tr13 + goto tr12 } case data[p] > 57: switch { case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr13 + goto tr12 } case data[p] >= 65: - goto tr13 + goto tr12 } default: - goto tr13 + goto tr12 } goto st0 -tr13: -//line uri_parse.rl:38 +tr12: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:42 +//line uri_parse.rl:51 buf[amt] = data[p] amt++ goto st8 -tr15: -//line uri_parse.rl:42 +tr14: +//line uri_parse.rl:51 buf[amt] = data[p] amt++ goto st8 -tr19: -//line uri_parse.rl:51 +tr18: +//line uri_parse.rl:60 hex += unhex(data[p]) buf[amt] = hex @@ -504,41 +486,41 @@ tr19: goto _test_eof8 } st_case_8: -//line uri_parse.go:508 +//line uri_parse.go:490 switch data[p] { case 33: - goto tr15 + goto tr14 case 37: goto st9 case 61: - goto tr15 + goto tr14 case 64: - goto tr17 + goto tr16 case 95: - goto tr15 + goto tr14 case 126: - goto tr15 + goto tr14 } switch { case data[p] < 48: if 36 <= data[p] && data[p] <= 46 { - goto tr15 + goto tr14 } case data[p] > 57: switch { case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr15 + goto tr14 } case data[p] >= 65: - goto tr15 + goto tr14 } default: - goto tr15 + goto tr14 } goto st0 -tr14: -//line uri_parse.rl:38 +tr13: +//line uri_parse.rl:47 amt = 0 @@ -548,22 +530,22 @@ tr14: goto _test_eof9 } st_case_9: -//line uri_parse.go:552 +//line uri_parse.go:534 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr18 + goto tr17 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr18 + goto tr17 } default: - goto tr18 + goto tr17 } goto st0 -tr18: -//line uri_parse.rl:47 +tr17: +//line uri_parse.rl:56 hex = unhex(data[p]) * 16 @@ -573,28 +555,28 @@ tr18: goto _test_eof10 } st_case_10: -//line uri_parse.go:577 +//line uri_parse.go:559 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr19 + goto tr18 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr19 + goto tr18 } default: - goto tr19 + goto tr18 } goto st0 -tr10: -//line uri_parse.rl:61 +tr9: +//line uri_parse.rl:78 uri.User = string(buf[0:amt]) goto st11 -tr17: -//line uri_parse.rl:65 +tr16: +//line uri_parse.rl:82 uri.Pass = string(buf[0:amt]) @@ -604,37 +586,37 @@ tr17: goto _test_eof11 } st_case_11: -//line uri_parse.go:608 +//line uri_parse.go:590 switch data[p] { case 43: - goto tr20 + goto tr19 case 91: goto st25 } switch { case data[p] < 48: if 45 <= data[p] && data[p] <= 46 { - goto tr20 + goto tr19 } case data[p] > 57: switch { case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr20 + goto tr19 } case data[p] >= 65: - goto tr20 + goto tr19 } default: - goto tr20 + goto tr19 } goto st0 -tr20: -//line uri_parse.rl:38 +tr19: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:87 +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -644,8 +626,8 @@ tr20: amt++ goto st45 -tr69: -//line uri_parse.rl:87 +tr66: +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -660,74 +642,55 @@ tr69: goto _test_eof45 } st_case_45: -//line uri_parse.go:664 +//line uri_parse.go:646 switch data[p] { - case 32: - goto tr68 case 43: - goto tr69 + goto tr66 case 58: - goto tr70 + goto tr67 case 59: - goto tr71 + goto tr68 case 63: - goto tr72 + goto tr69 } switch { case data[p] < 48: - switch { - case data[p] > 13: - if 45 <= data[p] && data[p] <= 46 { - goto tr69 - } - case data[p] >= 9: - goto tr68 + if 45 <= data[p] && data[p] <= 46 { + goto tr66 } case data[p] > 57: switch { case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr69 + goto tr66 } case data[p] >= 65: - goto tr69 + goto tr66 } default: - goto tr69 + goto tr66 } goto st0 -tr68: -//line uri_parse.rl:69 +tr67: +//line uri_parse.rl:86 uri.Host = string(buf[0:amt]) - goto st46 -tr76: -//line uri_parse.rl:77 - - b1 = string(buf[0:amt]) - amt = 0 - -//line uri_parse.rl:96 - - if uri.Params == nil { - uri.Params = Params{} - } - uri.Params[b1] = b2 - - goto st46 -tr82: -//line uri_parse.rl:82 - - b2 = string(buf[0:amt]) - amt = 0 - -//line uri_parse.rl:96 + goto st12 + st12: + if p++; p == pe { + goto _test_eof12 + } + st_case_12: +//line uri_parse.go:686 + if 48 <= data[p] && data[p] <= 57 { + goto tr21 + } + goto st0 +tr21: +//line uri_parse.rl:90 - if uri.Params == nil { - uri.Params = Params{} - } - uri.Params[b1] = b2 + uri.Port = uri.Port * 10 + uint16(data[p] - 0x30) goto st46 st46: @@ -735,59 +698,57 @@ tr82: goto _test_eof46 } st_case_46: -//line uri_parse.go:739 +//line uri_parse.go:702 switch data[p] { - case 32: - goto st46 case 59: - goto st12 + goto st13 case 63: - goto st18 + goto st19 } - if 9 <= data[p] && data[p] <= 13 { - goto st46 + if 48 <= data[p] && data[p] <= 57 { + goto tr21 } goto st0 -tr71: -//line uri_parse.rl:69 +tr68: +//line uri_parse.rl:86 uri.Host = string(buf[0:amt]) - goto st12 -tr79: -//line uri_parse.rl:77 + goto st13 +tr74: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:96 +//line uri_parse.rl:113 if uri.Params == nil { uri.Params = Params{} } uri.Params[b1] = b2 - goto st12 -tr85: -//line uri_parse.rl:82 + goto st13 +tr79: +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:96 +//line uri_parse.rl:113 if uri.Params == nil { uri.Params = Params{} } uri.Params[b1] = b2 - goto st12 - st12: + goto st13 + st13: if p++; p == pe { - goto _test_eof12 + goto _test_eof13 } - st_case_12: -//line uri_parse.go:791 + st_case_13: +//line uri_parse.go:752 switch data[p] { case 33: goto tr22 @@ -818,8 +779,8 @@ tr85: goto tr22 } goto st0 -tr77: -//line uri_parse.rl:87 +tr72: +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -830,7 +791,7 @@ tr77: goto st47 tr25: -//line uri_parse.rl:51 +//line uri_parse.rl:60 hex += unhex(data[p]) buf[amt] = hex @@ -838,16 +799,16 @@ tr25: goto st47 tr22: -//line uri_parse.rl:38 +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:82 +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:87 +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -862,67 +823,60 @@ tr22: goto _test_eof47 } st_case_47: -//line uri_parse.go:866 +//line uri_parse.go:827 switch data[p] { - case 32: - goto tr76 case 33: - goto tr77 + goto tr72 case 37: - goto st13 + goto st14 case 59: - goto tr79 + goto tr74 case 61: - goto tr80 + goto tr75 case 63: - goto tr81 + goto tr76 case 93: - goto tr77 + goto tr72 case 95: - goto tr77 + goto tr72 case 126: - goto tr77 + goto tr72 } switch { case data[p] < 45: - switch { - case data[p] > 13: - if 36 <= data[p] && data[p] <= 43 { - goto tr77 - } - case data[p] >= 9: - goto tr76 + if 36 <= data[p] && data[p] <= 43 { + goto tr72 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr77 + goto tr72 } case data[p] >= 65: - goto tr77 + goto tr72 } default: - goto tr77 + goto tr72 } goto st0 tr23: -//line uri_parse.rl:38 +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:82 +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 - goto st13 - st13: + goto st14 + st14: if p++; p == pe { - goto _test_eof13 + goto _test_eof14 } - st_case_13: -//line uri_parse.go:926 + st_case_14: +//line uri_parse.go:880 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { @@ -937,17 +891,17 @@ tr23: } goto st0 tr24: -//line uri_parse.rl:47 +//line uri_parse.rl:56 hex = unhex(data[p]) * 16 - goto st14 - st14: + goto st15 + st15: if p++; p == pe { - goto _test_eof14 + goto _test_eof15 } - st_case_14: -//line uri_parse.go:951 + st_case_15: +//line uri_parse.go:905 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { @@ -961,19 +915,19 @@ tr24: goto tr25 } goto st0 -tr80: -//line uri_parse.rl:77 +tr75: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 - goto st15 - st15: + goto st16 + st16: if p++; p == pe { - goto _test_eof15 + goto _test_eof16 } - st_case_15: -//line uri_parse.go:977 + st_case_16: +//line uri_parse.go:931 switch data[p] { case 33: goto tr26 @@ -1005,11 +959,11 @@ tr80: } goto st0 tr26: -//line uri_parse.rl:38 +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:87 +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -1019,8 +973,8 @@ tr26: amt++ goto st48 -tr83: -//line uri_parse.rl:87 +tr77: +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -1031,7 +985,7 @@ tr83: goto st48 tr29: -//line uri_parse.rl:51 +//line uri_parse.rl:60 hex += unhex(data[p]) buf[amt] = hex @@ -1043,60 +997,53 @@ tr29: goto _test_eof48 } st_case_48: -//line uri_parse.go:1047 +//line uri_parse.go:1001 switch data[p] { - case 32: - goto tr82 case 33: - goto tr83 + goto tr77 case 37: - goto st16 + goto st17 case 59: - goto tr85 + goto tr79 case 63: - goto tr86 + goto tr80 case 93: - goto tr83 + goto tr77 case 95: - goto tr83 + goto tr77 case 126: - goto tr83 + goto tr77 } switch { case data[p] < 45: - switch { - case data[p] > 13: - if 36 <= data[p] && data[p] <= 43 { - goto tr83 - } - case data[p] >= 9: - goto tr82 + if 36 <= data[p] && data[p] <= 43 { + goto tr77 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr83 + goto tr77 } case data[p] >= 65: - goto tr83 + goto tr77 } default: - goto tr83 + goto tr77 } goto st0 tr27: -//line uri_parse.rl:38 +//line uri_parse.rl:47 amt = 0 - goto st16 - st16: + goto st17 + st17: if p++; p == pe { - goto _test_eof16 + goto _test_eof17 } - st_case_16: -//line uri_parse.go:1100 + st_case_17: +//line uri_parse.go:1047 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { @@ -1111,17 +1058,17 @@ tr27: } goto st0 tr28: -//line uri_parse.rl:47 +//line uri_parse.rl:56 hex = unhex(data[p]) * 16 - goto st17 - st17: + goto st18 + st18: if p++; p == pe { - goto _test_eof17 + goto _test_eof18 } - st_case_17: -//line uri_parse.go:1125 + st_case_18: +//line uri_parse.go:1072 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { @@ -1135,74 +1082,74 @@ tr28: goto tr29 } goto st0 -tr72: -//line uri_parse.rl:69 +tr69: +//line uri_parse.rl:86 uri.Host = string(buf[0:amt]) - goto st18 -tr81: -//line uri_parse.rl:77 + goto st19 +tr76: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:96 +//line uri_parse.rl:113 if uri.Params == nil { uri.Params = Params{} } uri.Params[b1] = b2 - goto st18 -tr86: -//line uri_parse.rl:82 + goto st19 +tr80: +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:96 +//line uri_parse.rl:113 if uri.Params == nil { uri.Params = Params{} } uri.Params[b1] = b2 - goto st18 -tr90: -//line uri_parse.rl:77 + goto st19 +tr83: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:103 +//line uri_parse.rl:120 if uri.Headers == nil { uri.Headers = URIHeaders{} } uri.Headers[b1] = b2 - goto st18 -tr96: -//line uri_parse.rl:82 + goto st19 +tr87: +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:103 +//line uri_parse.rl:120 if uri.Headers == nil { uri.Headers = URIHeaders{} } uri.Headers[b1] = b2 - goto st18 - st18: + goto st19 + st19: if p++; p == pe { - goto _test_eof18 + goto _test_eof19 } - st_case_18: -//line uri_parse.go:1206 + st_case_19: +//line uri_parse.go:1153 switch data[p] { case 33: goto tr30 @@ -1237,15 +1184,15 @@ tr96: goto tr30 } goto st0 -tr88: -//line uri_parse.rl:42 +tr81: +//line uri_parse.rl:51 buf[amt] = data[p] amt++ goto st49 tr33: -//line uri_parse.rl:51 +//line uri_parse.rl:60 hex += unhex(data[p]) buf[amt] = hex @@ -1253,16 +1200,16 @@ tr33: goto st49 tr30: -//line uri_parse.rl:38 +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:82 +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:42 +//line uri_parse.rl:51 buf[amt] = data[p] amt++ @@ -1273,108 +1220,60 @@ tr30: goto _test_eof49 } st_case_49: -//line uri_parse.go:1277 +//line uri_parse.go:1224 switch data[p] { - case 32: - goto tr87 case 33: - goto tr88 + goto tr81 case 37: - goto st19 + goto st20 case 38: - goto tr90 + goto tr83 case 61: - goto tr91 + goto tr84 case 63: - goto tr88 + goto tr81 case 93: - goto tr88 + goto tr81 case 95: - goto tr88 + goto tr81 case 126: - goto tr88 + goto tr81 } switch { case data[p] < 45: - switch { - case data[p] > 13: - if 36 <= data[p] && data[p] <= 43 { - goto tr88 - } - case data[p] >= 9: - goto tr87 + if 36 <= data[p] && data[p] <= 43 { + goto tr81 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr88 + goto tr81 } case data[p] >= 65: - goto tr88 + goto tr81 } default: - goto tr88 - } - goto st0 -tr87: -//line uri_parse.rl:77 - - b1 = string(buf[0:amt]) - amt = 0 - -//line uri_parse.rl:103 - - if uri.Headers == nil { - uri.Headers = URIHeaders{} - } - uri.Headers[b1] = b2 - - goto st50 -tr93: -//line uri_parse.rl:82 - - b2 = string(buf[0:amt]) - amt = 0 - -//line uri_parse.rl:103 - - if uri.Headers == nil { - uri.Headers = URIHeaders{} - } - uri.Headers[b1] = b2 - - goto st50 - st50: - if p++; p == pe { - goto _test_eof50 - } - st_case_50: -//line uri_parse.go:1354 - if data[p] == 32 { - goto st50 - } - if 9 <= data[p] && data[p] <= 13 { - goto st50 + goto tr81 } goto st0 tr31: -//line uri_parse.rl:38 +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:82 +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 - goto st19 - st19: + goto st20 + st20: if p++; p == pe { - goto _test_eof19 + goto _test_eof20 } - st_case_19: -//line uri_parse.go:1378 + st_case_20: +//line uri_parse.go:1277 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { @@ -1389,17 +1288,17 @@ tr31: } goto st0 tr32: -//line uri_parse.rl:47 +//line uri_parse.rl:56 hex = unhex(data[p]) * 16 - goto st20 - st20: + goto st21 + st21: if p++; p == pe { - goto _test_eof20 + goto _test_eof21 } - st_case_20: -//line uri_parse.go:1403 + st_case_21: +//line uri_parse.go:1302 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { @@ -1413,19 +1312,19 @@ tr32: goto tr33 } goto st0 -tr91: -//line uri_parse.rl:77 +tr84: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 - goto st21 - st21: + goto st22 + st22: if p++; p == pe { - goto _test_eof21 + goto _test_eof22 } - st_case_21: -//line uri_parse.go:1429 + st_case_22: +//line uri_parse.go:1328 switch data[p] { case 33: goto tr34 @@ -1461,90 +1360,83 @@ tr91: } goto st0 tr34: -//line uri_parse.rl:38 +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:42 +//line uri_parse.rl:51 buf[amt] = data[p] amt++ - goto st51 -tr94: -//line uri_parse.rl:42 + goto st50 +tr85: +//line uri_parse.rl:51 buf[amt] = data[p] amt++ - goto st51 + goto st50 tr37: -//line uri_parse.rl:51 +//line uri_parse.rl:60 hex += unhex(data[p]) buf[amt] = hex amt++ - goto st51 - st51: + goto st50 + st50: if p++; p == pe { - goto _test_eof51 + goto _test_eof50 } - st_case_51: -//line uri_parse.go:1495 + st_case_50: +//line uri_parse.go:1394 switch data[p] { - case 32: - goto tr93 case 33: - goto tr94 + goto tr85 case 37: - goto st22 + goto st23 case 38: - goto tr96 + goto tr87 case 63: - goto tr94 + goto tr85 case 93: - goto tr94 + goto tr85 case 95: - goto tr94 + goto tr85 case 126: - goto tr94 + goto tr85 } switch { case data[p] < 45: - switch { - case data[p] > 13: - if 36 <= data[p] && data[p] <= 43 { - goto tr94 - } - case data[p] >= 9: - goto tr93 + if 36 <= data[p] && data[p] <= 43 { + goto tr85 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr94 + goto tr85 } case data[p] >= 65: - goto tr94 + goto tr85 } default: - goto tr94 + goto tr85 } goto st0 tr35: -//line uri_parse.rl:38 +//line uri_parse.rl:47 amt = 0 - goto st22 - st22: + goto st23 + st23: if p++; p == pe { - goto _test_eof22 + goto _test_eof23 } - st_case_22: -//line uri_parse.go:1548 + st_case_23: +//line uri_parse.go:1440 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { @@ -1559,17 +1451,17 @@ tr35: } goto st0 tr36: -//line uri_parse.rl:47 +//line uri_parse.rl:56 hex = unhex(data[p]) * 16 - goto st23 - st23: + goto st24 + st24: if p++; p == pe { - goto _test_eof23 + goto _test_eof24 } - st_case_23: -//line uri_parse.go:1573 + st_case_24: +//line uri_parse.go:1465 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { @@ -1583,78 +1475,33 @@ tr36: goto tr37 } goto st0 -tr70: -//line uri_parse.rl:69 - - uri.Host = string(buf[0:amt]) - - goto st24 - st24: + st25: if p++; p == pe { - goto _test_eof24 - } - st_case_24: -//line uri_parse.go:1598 - if 48 <= data[p] && data[p] <= 57 { - goto tr38 - } - goto st0 -tr38: -//line uri_parse.rl:73 - - uri.Port = uri.Port * 10 + uint16(data[p] - 0x30) - - goto st52 - st52: - if p++; p == pe { - goto _test_eof52 - } - st_case_52: -//line uri_parse.go:1614 - switch data[p] { - case 32: - goto st46 - case 59: - goto st12 - case 63: - goto st18 - } - switch { - case data[p] > 13: - if 48 <= data[p] && data[p] <= 57 { - goto tr38 - } - case data[p] >= 9: - goto st46 - } - goto st0 - st25: - if p++; p == pe { - goto _test_eof25 + goto _test_eof25 } st_case_25: if data[p] == 46 { - goto tr39 + goto tr38 } switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 58 { - goto tr39 + goto tr38 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr39 + goto tr38 } default: - goto tr39 + goto tr38 } goto st0 -tr39: -//line uri_parse.rl:38 +tr38: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:87 +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -1664,8 +1511,8 @@ tr39: amt++ goto st26 -tr40: -//line uri_parse.rl:87 +tr39: +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -1680,79 +1527,63 @@ tr40: goto _test_eof26 } st_case_26: -//line uri_parse.go:1684 +//line uri_parse.go:1531 switch data[p] { case 46: - goto tr40 + goto tr39 case 93: - goto tr41 + goto tr40 } switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 58 { - goto tr40 + goto tr39 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr40 + goto tr39 } default: - goto tr40 + goto tr39 } goto st0 -tr41: -//line uri_parse.rl:69 +tr40: +//line uri_parse.rl:86 uri.Host = string(buf[0:amt]) - goto st53 - st53: + goto st51 + st51: if p++; p == pe { - goto _test_eof53 + goto _test_eof51 } - st_case_53: -//line uri_parse.go:1715 + st_case_51: +//line uri_parse.go:1562 switch data[p] { - case 32: - goto st46 case 58: - goto st24 - case 59: goto st12 + case 59: + goto st13 case 63: - goto st18 - } - if 9 <= data[p] && data[p] <= 13 { - goto st46 + goto st19 } goto st0 - st27: - if p++; p == pe { - goto _test_eof27 - } st_case_27: - if data[p] == 32 { - goto st27 - } switch { - case data[p] < 65: - if 9 <= data[p] && data[p] <= 13 { - goto st27 - } case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr43 + goto tr41 } - default: - goto tr43 + case data[p] >= 65: + goto tr41 } goto st0 -tr43: -//line uri_parse.rl:38 +tr41: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:87 +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -1762,8 +1593,8 @@ tr43: amt++ goto st28 -tr44: -//line uri_parse.rl:87 +tr42: +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -1778,33 +1609,33 @@ tr44: goto _test_eof28 } st_case_28: -//line uri_parse.go:1782 +//line uri_parse.go:1613 switch data[p] { case 43: - goto tr44 + goto tr42 case 58: - goto tr45 + goto tr43 } switch { case data[p] < 48: if 45 <= data[p] && data[p] <= 46 { - goto tr44 + goto tr42 } case data[p] > 57: switch { case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr44 + goto tr42 } case data[p] >= 65: - goto tr44 + goto tr42 } default: - goto tr44 + goto tr42 } goto st0 -tr45: -//line uri_parse.rl:57 +tr43: +//line uri_parse.rl:74 uri.Scheme = string(buf[0:amt]) @@ -1814,37 +1645,37 @@ tr45: goto _test_eof29 } st_case_29: -//line uri_parse.go:1818 +//line uri_parse.go:1649 switch data[p] { case 43: - goto tr46 + goto tr44 case 91: goto st43 } switch { case data[p] < 48: if 45 <= data[p] && data[p] <= 46 { - goto tr46 + goto tr44 } case data[p] > 57: switch { case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr46 + goto tr44 } case data[p] >= 65: - goto tr46 + goto tr44 } default: - goto tr46 + goto tr44 } goto st0 -tr46: -//line uri_parse.rl:38 +tr44: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:87 +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -1853,9 +1684,9 @@ tr46: } amt++ - goto st54 -tr99: -//line uri_parse.rl:87 + goto st52 +tr89: +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -1864,172 +1695,151 @@ tr99: } amt++ - goto st54 - st54: + goto st52 + st52: if p++; p == pe { - goto _test_eof54 + goto _test_eof52 } - st_case_54: -//line uri_parse.go:1874 + st_case_52: +//line uri_parse.go:1705 switch data[p] { - case 32: - goto tr98 case 43: - goto tr99 + goto tr89 case 58: - goto tr100 + goto tr90 case 59: - goto tr101 + goto tr91 case 63: - goto tr102 + goto tr92 } switch { case data[p] < 48: - switch { - case data[p] > 13: - if 45 <= data[p] && data[p] <= 46 { - goto tr99 - } - case data[p] >= 9: - goto tr98 + if 45 <= data[p] && data[p] <= 46 { + goto tr89 } case data[p] > 57: switch { case data[p] > 90: if 97 <= data[p] && data[p] <= 122 { - goto tr99 + goto tr89 } case data[p] >= 65: - goto tr99 + goto tr89 } default: - goto tr99 + goto tr89 } goto st0 -tr98: -//line uri_parse.rl:69 +tr90: +//line uri_parse.rl:86 uri.Host = string(buf[0:amt]) - goto st55 -tr106: -//line uri_parse.rl:77 - - b1 = string(buf[0:amt]) - amt = 0 - -//line uri_parse.rl:96 - - if uri.Params == nil { - uri.Params = Params{} - } - uri.Params[b1] = b2 - - goto st55 -tr112: -//line uri_parse.rl:82 - - b2 = string(buf[0:amt]) - amt = 0 - -//line uri_parse.rl:96 + goto st30 + st30: + if p++; p == pe { + goto _test_eof30 + } + st_case_30: +//line uri_parse.go:1745 + if 48 <= data[p] && data[p] <= 57 { + goto tr46 + } + goto st0 +tr46: +//line uri_parse.rl:90 - if uri.Params == nil { - uri.Params = Params{} - } - uri.Params[b1] = b2 + uri.Port = uri.Port * 10 + uint16(data[p] - 0x30) - goto st55 - st55: + goto st53 + st53: if p++; p == pe { - goto _test_eof55 + goto _test_eof53 } - st_case_55: -//line uri_parse.go:1949 + st_case_53: +//line uri_parse.go:1761 switch data[p] { - case 32: - goto st55 case 59: - goto st30 + goto st31 case 63: - goto st36 + goto st37 } - if 9 <= data[p] && data[p] <= 13 { - goto st55 + if 48 <= data[p] && data[p] <= 57 { + goto tr46 } goto st0 -tr101: -//line uri_parse.rl:69 +tr91: +//line uri_parse.rl:86 uri.Host = string(buf[0:amt]) - goto st30 -tr109: -//line uri_parse.rl:77 + goto st31 +tr97: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:96 +//line uri_parse.rl:113 if uri.Params == nil { uri.Params = Params{} } uri.Params[b1] = b2 - goto st30 -tr115: -//line uri_parse.rl:82 + goto st31 +tr102: +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:96 +//line uri_parse.rl:113 if uri.Params == nil { uri.Params = Params{} } uri.Params[b1] = b2 - goto st30 - st30: + goto st31 + st31: if p++; p == pe { - goto _test_eof30 + goto _test_eof31 } - st_case_30: -//line uri_parse.go:2001 + st_case_31: +//line uri_parse.go:1811 switch data[p] { case 33: - goto tr48 + goto tr47 case 37: - goto tr49 - case 93: goto tr48 + case 93: + goto tr47 case 95: - goto tr48 + goto tr47 case 126: - goto tr48 + goto tr47 } switch { case data[p] < 45: if 36 <= data[p] && data[p] <= 43 { - goto tr48 + goto tr47 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr48 + goto tr47 } case data[p] >= 65: - goto tr48 + goto tr47 } default: - goto tr48 + goto tr47 } goto st0 -tr107: -//line uri_parse.rl:87 +tr95: +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -2038,26 +1848,26 @@ tr107: } amt++ - goto st56 -tr51: -//line uri_parse.rl:51 + goto st54 +tr50: +//line uri_parse.rl:60 hex += unhex(data[p]) buf[amt] = hex amt++ - goto st56 -tr48: -//line uri_parse.rl:38 + goto st54 +tr47: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:82 +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:87 +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -2066,160 +1876,153 @@ tr48: } amt++ - goto st56 - st56: + goto st54 + st54: if p++; p == pe { - goto _test_eof56 + goto _test_eof54 } - st_case_56: -//line uri_parse.go:2076 + st_case_54: +//line uri_parse.go:1886 switch data[p] { - case 32: - goto tr106 case 33: - goto tr107 + goto tr95 case 37: - goto st31 + goto st32 case 59: - goto tr109 + goto tr97 case 61: - goto tr110 + goto tr98 case 63: - goto tr111 + goto tr99 case 93: - goto tr107 + goto tr95 case 95: - goto tr107 + goto tr95 case 126: - goto tr107 + goto tr95 } switch { case data[p] < 45: - switch { - case data[p] > 13: - if 36 <= data[p] && data[p] <= 43 { - goto tr107 - } - case data[p] >= 9: - goto tr106 + if 36 <= data[p] && data[p] <= 43 { + goto tr95 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr107 + goto tr95 } case data[p] >= 65: - goto tr107 + goto tr95 } default: - goto tr107 + goto tr95 } goto st0 -tr49: -//line uri_parse.rl:38 +tr48: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:82 +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 - goto st31 - st31: + goto st32 + st32: if p++; p == pe { - goto _test_eof31 + goto _test_eof32 } - st_case_31: -//line uri_parse.go:2136 + st_case_32: +//line uri_parse.go:1939 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr50 + goto tr49 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr50 + goto tr49 } default: - goto tr50 + goto tr49 } goto st0 -tr50: -//line uri_parse.rl:47 +tr49: +//line uri_parse.rl:56 hex = unhex(data[p]) * 16 - goto st32 - st32: + goto st33 + st33: if p++; p == pe { - goto _test_eof32 + goto _test_eof33 } - st_case_32: -//line uri_parse.go:2161 + st_case_33: +//line uri_parse.go:1964 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr51 + goto tr50 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr51 + goto tr50 } default: - goto tr51 + goto tr50 } goto st0 -tr110: -//line uri_parse.rl:77 +tr98: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 - goto st33 - st33: + goto st34 + st34: if p++; p == pe { - goto _test_eof33 + goto _test_eof34 } - st_case_33: -//line uri_parse.go:2187 + st_case_34: +//line uri_parse.go:1990 switch data[p] { case 33: - goto tr52 + goto tr51 case 37: - goto tr53 - case 93: goto tr52 + case 93: + goto tr51 case 95: - goto tr52 + goto tr51 case 126: - goto tr52 + goto tr51 } switch { case data[p] < 45: if 36 <= data[p] && data[p] <= 43 { - goto tr52 + goto tr51 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr52 + goto tr51 } case data[p] >= 65: - goto tr52 + goto tr51 } default: - goto tr52 + goto tr51 } goto st0 -tr52: -//line uri_parse.rl:38 +tr51: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:87 +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -2228,9 +2031,9 @@ tr52: } amt++ - goto st57 -tr113: -//line uri_parse.rl:87 + goto st55 +tr100: +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -2239,539 +2042,452 @@ tr113: } amt++ - goto st57 -tr55: -//line uri_parse.rl:51 + goto st55 +tr54: +//line uri_parse.rl:60 hex += unhex(data[p]) buf[amt] = hex amt++ - goto st57 - st57: + goto st55 + st55: if p++; p == pe { - goto _test_eof57 + goto _test_eof55 } - st_case_57: -//line uri_parse.go:2257 + st_case_55: +//line uri_parse.go:2060 switch data[p] { - case 32: - goto tr112 case 33: - goto tr113 + goto tr100 case 37: - goto st34 + goto st35 case 59: - goto tr115 + goto tr102 case 63: - goto tr116 + goto tr103 case 93: - goto tr113 + goto tr100 case 95: - goto tr113 + goto tr100 case 126: - goto tr113 + goto tr100 } switch { case data[p] < 45: - switch { - case data[p] > 13: - if 36 <= data[p] && data[p] <= 43 { - goto tr113 - } - case data[p] >= 9: - goto tr112 + if 36 <= data[p] && data[p] <= 43 { + goto tr100 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr113 + goto tr100 } case data[p] >= 65: - goto tr113 + goto tr100 } default: - goto tr113 + goto tr100 } goto st0 -tr53: -//line uri_parse.rl:38 +tr52: +//line uri_parse.rl:47 amt = 0 - goto st34 - st34: + goto st35 + st35: if p++; p == pe { - goto _test_eof34 + goto _test_eof35 } - st_case_34: -//line uri_parse.go:2310 + st_case_35: +//line uri_parse.go:2106 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr54 + goto tr53 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr54 + goto tr53 } default: - goto tr54 + goto tr53 } goto st0 -tr54: -//line uri_parse.rl:47 +tr53: +//line uri_parse.rl:56 hex = unhex(data[p]) * 16 - goto st35 - st35: + goto st36 + st36: if p++; p == pe { - goto _test_eof35 + goto _test_eof36 } - st_case_35: -//line uri_parse.go:2335 + st_case_36: +//line uri_parse.go:2131 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr55 + goto tr54 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr55 + goto tr54 } default: - goto tr55 + goto tr54 } goto st0 -tr102: -//line uri_parse.rl:69 +tr92: +//line uri_parse.rl:86 uri.Host = string(buf[0:amt]) - goto st36 -tr111: -//line uri_parse.rl:77 + goto st37 +tr99: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:96 +//line uri_parse.rl:113 if uri.Params == nil { uri.Params = Params{} } uri.Params[b1] = b2 - goto st36 -tr116: -//line uri_parse.rl:82 + goto st37 +tr103: +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:96 +//line uri_parse.rl:113 if uri.Params == nil { uri.Params = Params{} } uri.Params[b1] = b2 - goto st36 -tr120: -//line uri_parse.rl:77 + goto st37 +tr106: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:103 +//line uri_parse.rl:120 if uri.Headers == nil { uri.Headers = URIHeaders{} } uri.Headers[b1] = b2 - goto st36 -tr126: -//line uri_parse.rl:82 + goto st37 +tr110: +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:103 +//line uri_parse.rl:120 if uri.Headers == nil { uri.Headers = URIHeaders{} } uri.Headers[b1] = b2 - goto st36 - st36: + goto st37 + st37: if p++; p == pe { - goto _test_eof36 + goto _test_eof37 } - st_case_36: -//line uri_parse.go:2416 + st_case_37: +//line uri_parse.go:2212 switch data[p] { case 33: - goto tr56 + goto tr55 case 36: - goto tr56 + goto tr55 case 37: - goto tr57 - case 63: goto tr56 + case 63: + goto tr55 case 93: - goto tr56 + goto tr55 case 95: - goto tr56 + goto tr55 case 126: - goto tr56 + goto tr55 } switch { case data[p] < 45: if 39 <= data[p] && data[p] <= 43 { - goto tr56 + goto tr55 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr56 + goto tr55 } case data[p] >= 65: - goto tr56 + goto tr55 } default: - goto tr56 + goto tr55 } goto st0 -tr118: -//line uri_parse.rl:42 +tr104: +//line uri_parse.rl:51 buf[amt] = data[p] amt++ - goto st58 -tr59: -//line uri_parse.rl:51 + goto st56 +tr58: +//line uri_parse.rl:60 hex += unhex(data[p]) buf[amt] = hex amt++ - goto st58 -tr56: -//line uri_parse.rl:38 + goto st56 +tr55: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:82 +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:42 +//line uri_parse.rl:51 buf[amt] = data[p] amt++ - goto st58 - st58: + goto st56 + st56: if p++; p == pe { - goto _test_eof58 + goto _test_eof56 } - st_case_58: -//line uri_parse.go:2487 + st_case_56: +//line uri_parse.go:2283 switch data[p] { - case 32: - goto tr117 case 33: - goto tr118 + goto tr104 case 37: - goto st37 + goto st38 case 38: - goto tr120 + goto tr106 case 61: - goto tr121 + goto tr107 case 63: - goto tr118 + goto tr104 case 93: - goto tr118 + goto tr104 case 95: - goto tr118 + goto tr104 case 126: - goto tr118 + goto tr104 } switch { case data[p] < 45: - switch { - case data[p] > 13: - if 36 <= data[p] && data[p] <= 43 { - goto tr118 - } - case data[p] >= 9: - goto tr117 + if 36 <= data[p] && data[p] <= 43 { + goto tr104 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr118 + goto tr104 } case data[p] >= 65: - goto tr118 + goto tr104 } default: - goto tr118 - } - goto st0 -tr117: -//line uri_parse.rl:77 - - b1 = string(buf[0:amt]) - amt = 0 - -//line uri_parse.rl:103 - - if uri.Headers == nil { - uri.Headers = URIHeaders{} - } - uri.Headers[b1] = b2 - - goto st59 -tr123: -//line uri_parse.rl:82 - - b2 = string(buf[0:amt]) - amt = 0 - -//line uri_parse.rl:103 - - if uri.Headers == nil { - uri.Headers = URIHeaders{} - } - uri.Headers[b1] = b2 - - goto st59 - st59: - if p++; p == pe { - goto _test_eof59 - } - st_case_59: -//line uri_parse.go:2564 - if data[p] == 32 { - goto st59 - } - if 9 <= data[p] && data[p] <= 13 { - goto st59 + goto tr104 } goto st0 -tr57: -//line uri_parse.rl:38 +tr56: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:82 +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 - goto st37 - st37: + goto st38 + st38: if p++; p == pe { - goto _test_eof37 + goto _test_eof38 } - st_case_37: -//line uri_parse.go:2588 + st_case_38: +//line uri_parse.go:2336 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr58 + goto tr57 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr58 + goto tr57 } default: - goto tr58 + goto tr57 } goto st0 -tr58: -//line uri_parse.rl:47 +tr57: +//line uri_parse.rl:56 hex = unhex(data[p]) * 16 - goto st38 - st38: + goto st39 + st39: if p++; p == pe { - goto _test_eof38 + goto _test_eof39 } - st_case_38: -//line uri_parse.go:2613 + st_case_39: +//line uri_parse.go:2361 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr59 + goto tr58 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr59 + goto tr58 } default: - goto tr59 + goto tr58 } goto st0 -tr121: -//line uri_parse.rl:77 +tr107: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 - goto st39 - st39: + goto st40 + st40: if p++; p == pe { - goto _test_eof39 + goto _test_eof40 } - st_case_39: -//line uri_parse.go:2639 + st_case_40: +//line uri_parse.go:2387 switch data[p] { case 33: - goto tr60 + goto tr59 case 36: - goto tr60 + goto tr59 case 37: - goto tr61 - case 63: goto tr60 + case 63: + goto tr59 case 93: - goto tr60 + goto tr59 case 95: - goto tr60 + goto tr59 case 126: - goto tr60 + goto tr59 } switch { case data[p] < 45: if 39 <= data[p] && data[p] <= 43 { - goto tr60 + goto tr59 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr60 + goto tr59 } case data[p] >= 65: - goto tr60 + goto tr59 } default: - goto tr60 + goto tr59 } goto st0 -tr60: -//line uri_parse.rl:38 +tr59: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:42 +//line uri_parse.rl:51 buf[amt] = data[p] amt++ - goto st60 -tr124: -//line uri_parse.rl:42 + goto st57 +tr108: +//line uri_parse.rl:51 buf[amt] = data[p] amt++ - goto st60 -tr63: -//line uri_parse.rl:51 + goto st57 +tr62: +//line uri_parse.rl:60 hex += unhex(data[p]) buf[amt] = hex amt++ - goto st60 - st60: + goto st57 + st57: if p++; p == pe { - goto _test_eof60 + goto _test_eof57 } - st_case_60: -//line uri_parse.go:2705 + st_case_57: +//line uri_parse.go:2453 switch data[p] { - case 32: - goto tr123 case 33: - goto tr124 + goto tr108 case 37: - goto st40 + goto st41 case 38: - goto tr126 + goto tr110 case 63: - goto tr124 + goto tr108 case 93: - goto tr124 + goto tr108 case 95: - goto tr124 + goto tr108 case 126: - goto tr124 + goto tr108 } switch { case data[p] < 45: - switch { - case data[p] > 13: - if 36 <= data[p] && data[p] <= 43 { - goto tr124 - } - case data[p] >= 9: - goto tr123 + if 36 <= data[p] && data[p] <= 43 { + goto tr108 } case data[p] > 58: switch { case data[p] > 91: if 97 <= data[p] && data[p] <= 122 { - goto tr124 + goto tr108 } case data[p] >= 65: - goto tr124 - } - default: - goto tr124 - } - goto st0 -tr61: -//line uri_parse.rl:38 - - amt = 0 - - goto st40 - st40: - if p++; p == pe { - goto _test_eof40 - } - st_case_40: -//line uri_parse.go:2758 - switch { - case data[p] < 65: - if 48 <= data[p] && data[p] <= 57 { - goto tr62 - } - case data[p] > 70: - if 97 <= data[p] && data[p] <= 102 { - goto tr62 + goto tr108 } default: - goto tr62 + goto tr108 } goto st0 -tr62: +tr60: //line uri_parse.rl:47 - hex = unhex(data[p]) * 16 + amt = 0 goto st41 st41: @@ -2779,24 +2495,24 @@ tr62: goto _test_eof41 } st_case_41: -//line uri_parse.go:2783 +//line uri_parse.go:2499 switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr63 + goto tr61 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr63 + goto tr61 } default: - goto tr63 + goto tr61 } goto st0 -tr100: -//line uri_parse.rl:69 +tr61: +//line uri_parse.rl:56 - uri.Host = string(buf[0:amt]) + hex = unhex(data[p]) * 16 goto st42 st42: @@ -2804,38 +2520,18 @@ tr100: goto _test_eof42 } st_case_42: -//line uri_parse.go:2808 - if 48 <= data[p] && data[p] <= 57 { - goto tr64 - } - goto st0 -tr64: -//line uri_parse.rl:73 - - uri.Port = uri.Port * 10 + uint16(data[p] - 0x30) - - goto st61 - st61: - if p++; p == pe { - goto _test_eof61 - } - st_case_61: -//line uri_parse.go:2824 - switch data[p] { - case 32: - goto st55 - case 59: - goto st30 - case 63: - goto st36 - } +//line uri_parse.go:2524 switch { - case data[p] > 13: + case data[p] < 65: if 48 <= data[p] && data[p] <= 57 { - goto tr64 + goto tr62 + } + case data[p] > 70: + if 97 <= data[p] && data[p] <= 102 { + goto tr62 } - case data[p] >= 9: - goto st55 + default: + goto tr62 } goto st0 st43: @@ -2844,27 +2540,27 @@ tr64: } st_case_43: if data[p] == 46 { - goto tr65 + goto tr63 } switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 58 { - goto tr65 + goto tr63 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr65 + goto tr63 } default: - goto tr65 + goto tr63 } goto st0 -tr65: -//line uri_parse.rl:38 +tr63: +//line uri_parse.rl:47 amt = 0 -//line uri_parse.rl:87 +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -2874,8 +2570,8 @@ tr65: amt++ goto st44 -tr66: -//line uri_parse.rl:87 +tr64: +//line uri_parse.rl:104 if 'A' <= data[p] && data[p] <= 'Z' { buf[amt] = data[p] + 0x20 @@ -2890,54 +2586,48 @@ tr66: goto _test_eof44 } st_case_44: -//line uri_parse.go:2894 +//line uri_parse.go:2590 switch data[p] { case 46: - goto tr66 + goto tr64 case 93: - goto tr67 + goto tr65 } switch { case data[p] < 65: if 48 <= data[p] && data[p] <= 58 { - goto tr66 + goto tr64 } case data[p] > 70: if 97 <= data[p] && data[p] <= 102 { - goto tr66 + goto tr64 } default: - goto tr66 + goto tr64 } goto st0 -tr67: -//line uri_parse.rl:69 +tr65: +//line uri_parse.rl:86 uri.Host = string(buf[0:amt]) - goto st62 - st62: + goto st58 + st58: if p++; p == pe { - goto _test_eof62 + goto _test_eof58 } - st_case_62: -//line uri_parse.go:2925 + st_case_58: +//line uri_parse.go:2621 switch data[p] { - case 32: - goto st55 case 58: - goto st42 - case 59: goto st30 + case 59: + goto st31 case 63: - goto st36 - } - if 9 <= data[p] && data[p] <= 13 { - goto st55 + goto st37 } goto st0 st_out: - _test_eof1: cs = 1; goto _test_eof _test_eof2: cs = 2; goto _test_eof _test_eof3: cs = 3; goto _test_eof _test_eof4: cs = 4; goto _test_eof @@ -2949,125 +2639,120 @@ tr67: _test_eof10: cs = 10; goto _test_eof _test_eof11: cs = 11; goto _test_eof _test_eof45: cs = 45; goto _test_eof - _test_eof46: cs = 46; goto _test_eof _test_eof12: cs = 12; goto _test_eof - _test_eof47: cs = 47; goto _test_eof + _test_eof46: cs = 46; goto _test_eof _test_eof13: cs = 13; goto _test_eof + _test_eof47: cs = 47; goto _test_eof _test_eof14: cs = 14; goto _test_eof _test_eof15: cs = 15; goto _test_eof - _test_eof48: cs = 48; goto _test_eof _test_eof16: cs = 16; goto _test_eof + _test_eof48: cs = 48; goto _test_eof _test_eof17: cs = 17; goto _test_eof _test_eof18: cs = 18; goto _test_eof - _test_eof49: cs = 49; goto _test_eof - _test_eof50: cs = 50; goto _test_eof _test_eof19: cs = 19; goto _test_eof + _test_eof49: cs = 49; goto _test_eof _test_eof20: cs = 20; goto _test_eof _test_eof21: cs = 21; goto _test_eof - _test_eof51: cs = 51; goto _test_eof _test_eof22: cs = 22; goto _test_eof + _test_eof50: cs = 50; goto _test_eof _test_eof23: cs = 23; goto _test_eof _test_eof24: cs = 24; goto _test_eof - _test_eof52: cs = 52; goto _test_eof _test_eof25: cs = 25; goto _test_eof _test_eof26: cs = 26; goto _test_eof - _test_eof53: cs = 53; goto _test_eof - _test_eof27: cs = 27; goto _test_eof + _test_eof51: cs = 51; goto _test_eof _test_eof28: cs = 28; goto _test_eof _test_eof29: cs = 29; goto _test_eof - _test_eof54: cs = 54; goto _test_eof - _test_eof55: cs = 55; goto _test_eof + _test_eof52: cs = 52; goto _test_eof _test_eof30: cs = 30; goto _test_eof - _test_eof56: cs = 56; goto _test_eof + _test_eof53: cs = 53; goto _test_eof _test_eof31: cs = 31; goto _test_eof + _test_eof54: cs = 54; goto _test_eof _test_eof32: cs = 32; goto _test_eof _test_eof33: cs = 33; goto _test_eof - _test_eof57: cs = 57; goto _test_eof _test_eof34: cs = 34; goto _test_eof + _test_eof55: cs = 55; goto _test_eof _test_eof35: cs = 35; goto _test_eof _test_eof36: cs = 36; goto _test_eof - _test_eof58: cs = 58; goto _test_eof - _test_eof59: cs = 59; goto _test_eof _test_eof37: cs = 37; goto _test_eof + _test_eof56: cs = 56; goto _test_eof _test_eof38: cs = 38; goto _test_eof _test_eof39: cs = 39; goto _test_eof - _test_eof60: cs = 60; goto _test_eof _test_eof40: cs = 40; goto _test_eof + _test_eof57: cs = 57; goto _test_eof _test_eof41: cs = 41; goto _test_eof _test_eof42: cs = 42; goto _test_eof - _test_eof61: cs = 61; goto _test_eof _test_eof43: cs = 43; goto _test_eof _test_eof44: cs = 44; goto _test_eof - _test_eof62: cs = 62; goto _test_eof + _test_eof58: cs = 58; goto _test_eof _test_eof: {} if p == eof { switch cs { - case 45, 54: -//line uri_parse.rl:69 + case 45, 52: +//line uri_parse.rl:86 uri.Host = string(buf[0:amt]) - case 47, 56: -//line uri_parse.rl:77 + case 47, 54: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:96 +//line uri_parse.rl:113 if uri.Params == nil { uri.Params = Params{} } uri.Params[b1] = b2 - case 49, 58: -//line uri_parse.rl:77 + case 49, 56: +//line uri_parse.rl:94 b1 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:103 +//line uri_parse.rl:120 if uri.Headers == nil { uri.Headers = URIHeaders{} } uri.Headers[b1] = b2 - case 48, 57: -//line uri_parse.rl:82 + case 48, 55: +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:96 +//line uri_parse.rl:113 if uri.Params == nil { uri.Params = Params{} } uri.Params[b1] = b2 - case 51, 60: -//line uri_parse.rl:82 + case 50, 57: +//line uri_parse.rl:99 b2 = string(buf[0:amt]) amt = 0 -//line uri_parse.rl:103 +//line uri_parse.rl:120 if uri.Headers == nil { uri.Headers = URIHeaders{} } uri.Headers[b1] = b2 -//line uri_parse.go:3064 +//line uri_parse.go:2749 } } _out: {} } -//line uri_parse.rl:158 +//line uri_parse.rl:180 if cs < uri_first_final { if p == pe { diff --git a/sip/uri_parse.rl b/sip/uri_parse.rl index de1e99f..defba58 100644 --- a/sip/uri_parse.rl +++ b/sip/uri_parse.rl @@ -31,10 +31,19 @@ func ParseURIBytes(data []byte) (uri *URI, err error) { eof := len(data) buf := make([]byte, len(data)) amt := 0 + // mark := 0 var b1, b2 string var hex byte %%{ + action mark { + mark = p + } + + action backtrack { + fexec mark; + } + action start { amt = 0 } @@ -54,6 +63,14 @@ func ParseURIBytes(data []byte) (uri *URI, err error) { amt++ } + action goto_uriSansUser { + fgoto uriSansUser; + } + + action goto_uriWithUser { + fgoto uriWithUser; + } + action scheme { uri.Scheme = string(buf[0:amt]) } @@ -93,7 +110,7 @@ func ParseURIBytes(data []byte) (uri *URI, err error) { amt++ } - action param { + action uparam { if uri.Params == nil { uri.Params = Params{} } @@ -108,44 +125,49 @@ func ParseURIBytes(data []byte) (uri *URI, err error) { } # Byte character definitions. - mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" ; - reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," ; - unreserved = alpha | digit | mark ; - ipv4 = digit | "." ; - ipv6 = xdigit | "." | ":" ; - hostname = alpha | digit | "-" | "." ; - tel = digit | "+" | "-" ; - schmchars = alpha | digit | "+" | "-" | "." ; - userchars = unreserved | "&" | "=" | "+" | "$" | "," | ";" | "?" | "/" ; - passchars = unreserved | "&" | "=" | "+" | "$" | "," ; - paramchars = unreserved | "[" | "]" | "/" | ":" | "&" | "+" | "$" ; - headerchars = unreserved | "[" | "]" | "/" | "?" | ":" | "+" | "$" ; + mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"; + reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","; + unreserved = alnum | mark; + ipv4c = digit | "."; + ipv6c = xdigit | "." | ":"; + hostc = alnum | "-" | "."; + telc = digit | "+" | "-"; + schemec = alnum | "+" | "-" | "."; + uric = reserved | unreserved | "%" | "[" | "]"; + userc = unreserved | "&" | "=" | "+" | "$" | "," | ";" | "?" | "/"; + passc = unreserved | "&" | "=" | "+" | "$" | ","; + uparamc = unreserved | "[" | "]" | "/" | ":" | "&" | "+" | "$"; + headerc = unreserved | "[" | "]" | "/" | "?" | ":" | "+" | "$"; # Multibyte character definitions. - escaped = "%" ( xdigit @hexHi ) ( xdigit @hexLo ) ; - userchar = escaped | ( userchars @append ) ; - passchar = escaped | ( passchars @append ) ; - paramchar = escaped | ( paramchars @lower ) ; - headerchar = escaped | ( headerchars @append ) ; + escaped = "%" ( xdigit @hexHi ) ( xdigit @hexLo ); + userchar = escaped | ( userc @append ); + passchar = escaped | ( passc @append ); + uparamchar = escaped | ( uparamc @lower ); + headerchar = escaped | ( headerc @append ); # URI component definitions. - scheme = ( alpha schmchars* ) >start @lower %scheme ; - user = userchar+ >start %user ; - pass = passchar+ >start %pass ; - host6 = "[" ( ipv6+ >start @lower %host ) "]" ; - host = host6 | ( ( ipv4 | hostname | tel )+ >start @lower %host ) ; - port = digit+ @port ; - paramkey = paramchar+ >start >b2 %b1 ; - paramval = paramchar+ >start %b2 ; - param = space* ";" paramkey ( "=" paramval )? %param ; - headerkey = headerchar+ >start >b2 %b1 ; - headerval = headerchar+ >start %b2 ; - header = headerkey ( "=" headerval )? %header ; - headers = "?" header ( "&" header )* ; - userpass = user ( ":" pass )? ; - hostport = host ( ":" port )? ; - uriSansUser := space* scheme ":" hostport param* space* headers? space* ; - uriWithUser := space* scheme ":" userpass "@" hostport param* space* headers? space* ; + scheme = ( alpha schemec* ) >start @lower %scheme; + user = userchar+ >start %user; + pass = passchar+ >start %pass; + host6 = "[" ( ipv6c+ >start @lower %host ) "]"; + host = host6 | ( ( ipv4c | hostc | telc )+ >start @lower %host ); + port = digit+ @port; + uparamkey = uparamchar+ >start >b2 %b1; + uparamval = uparamchar+ >start %b2; + uparam = ";" uparamkey ( "=" uparamval )? %uparam; + headerkey = headerchar+ >start >b2 %b1; + headerval = headerchar+ >start %b2; + header = headerkey ( "=" headerval )? %header; + headers = "?" header ( "&" header )*; + userpass = user ( ":" pass )?; + hostport = host ( ":" port )?; + uriSansUser := scheme ":" hostport uparam* headers?; + uriWithUser := scheme ":" userpass "@" hostport uparam* headers?; + + # XXX: This backtracking solution causes a weird Ragel bug. + # uri := any+ >mark %backtrack %goto_uriSansUser + # | any+ >mark :> "@" @backtrack @goto_uriWithUser; }%% %% write init; diff --git a/sip/uri_test.go b/sip/uri_test.go index 79cb876..3323fc4 100755 --- a/sip/uri_test.go +++ b/sip/uri_test.go @@ -135,15 +135,7 @@ var uriTests = []uriTest{ uriTest{ s: "sips:google.com ;lol ;h=omg", - uri: &sip.URI{ - Scheme: "sips", - Host: "google.com", - Params: sip.Params{ - "lol": "", - "h": "omg", - }, - }, - skipFormat: true, + e: errors.New("Error in URI at pos 15: sips:google.com ;lol ;h=omg"), }, uriTest{