log/net: switch => match
							parent
							
								
									7ba5248e56
								
							
						
					
					
						commit
						ed55826686
					
				|  | @ -50,56 +50,56 @@ pub fn (l Log) fatal(s string){ | ||||||
| 
 | 
 | ||||||
| pub fn (l Log) error(s string){ | pub fn (l Log) error(s string){ | ||||||
|     if l.level >= ERROR{ |     if l.level >= ERROR{ | ||||||
|         switch l.output { |         match l.output { | ||||||
|         case 'terminal': |             'terminal'{ | ||||||
|             f := term.red('E') |                 f := term.red('E') | ||||||
|             t := time.now() |                 t := time.now() | ||||||
|             println('[$f ${t.format_ss()}] $s') |                 println('[$f ${t.format_ss()}] $s') | ||||||
| 
 |             } else { | ||||||
|         default: |                 l.log_file(s, 'E') | ||||||
|             l.log_file(s, 'E') |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn (l Log) warn(s string){ | pub fn (l Log) warn(s string){ | ||||||
|     if l.level >= WARN{ |     if l.level >= WARN{ | ||||||
|         switch l.output { |         match l.output { | ||||||
|         case 'terminal': |             'terminal'{ | ||||||
|             f := term.yellow('W') |                 f := term.yellow('W') | ||||||
|             t := time.now() |                 t := time.now() | ||||||
|             println('[$f ${t.format_ss()}] $s') |                 println('[$f ${t.format_ss()}] $s') | ||||||
| 
 |             } else { | ||||||
|         default: |                 l.log_file(s, 'W') | ||||||
|             l.log_file(s, 'W') |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn (l Log) info(s string){ | pub fn (l Log) info(s string){ | ||||||
|     if l.level >= INFO{ |     if l.level >= INFO{ | ||||||
|         switch l.output { |         match l.output { | ||||||
|         case 'terminal': |             'terminal'{ | ||||||
|             f := term.white('I') |                 f := term.white('I') | ||||||
|             t := time.now() |                 t := time.now() | ||||||
|             println('[$f ${t.format_ss()}] $s') |                 println('[$f ${t.format_ss()}] $s') | ||||||
| 
 |             } else { | ||||||
|         default: |               l.log_file(s, 'I') | ||||||
|             l.log_file(s, 'I') |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn (l Log) debug(s string){ | pub fn (l Log) debug(s string){ | ||||||
|     if l.level >= DEBUG{ |     if l.level >= DEBUG{ | ||||||
|         switch l.output { |         match l.output { | ||||||
|         case 'terminal': |             'terminal' { | ||||||
|             f := term.blue('D') |                 f := term.blue('D') | ||||||
|             t := time.now() |                 t := time.now() | ||||||
|             println('[$f ${t.format_ss()}] $s') |                 println('[$f ${t.format_ss()}] $s') | ||||||
| 
 |             } else { | ||||||
|         default: |                 l.log_file(s, 'D') | ||||||
|             l.log_file(s, 'D') |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -114,9 +114,10 @@ fn should_escape(c byte, mode EncodingMode) bool { | ||||||
| 		// (1) we always escape sub-delims outside of the fragment, and (2) we always
 | 		// (1) we always escape sub-delims outside of the fragment, and (2) we always
 | ||||||
| 		// escape single quote to avoid breaking callers that had previously assumed that
 | 		// escape single quote to avoid breaking callers that had previously assumed that
 | ||||||
| 		// single quotes would be escaped. See issue #19917.
 | 		// single quotes would be escaped. See issue #19917.
 | ||||||
| 		switch c { | 		match c { | ||||||
| 		case `!`, `(`, `)`, `*`: | 			`!`, `(`, `)`, `*`{ | ||||||
| 			return false | 				return false | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -153,50 +154,53 @@ fn unescape(s_ string, mode EncodingMode) ?string { | ||||||
| 	mut has_plus := false | 	mut has_plus := false | ||||||
| 	for i := 0; i < s.len; { | 	for i := 0; i < s.len; { | ||||||
| 		x := s[i] | 		x := s[i] | ||||||
| 		switch x { | 		match x { | ||||||
| 		case `%`: | 			`%` { | ||||||
| 			if s == '' { | 				if s == '' { | ||||||
| 				break | 					break | ||||||
| 			} |  | ||||||
| 			n++ |  | ||||||
| 			if i+2 >= s.len || !ishex(s[i+1]) || !ishex(s[i+2]) { |  | ||||||
| 				s = s.right(i) |  | ||||||
| 				if s.len > 3 { |  | ||||||
| 					s = s.left(3) |  | ||||||
| 				} | 				} | ||||||
| 				return error(error_msg(err_msg_escape, s)) | 				n++ | ||||||
| 			} | 				if i+2 >= s.len || !ishex(s[i+1]) || !ishex(s[i+2]) { | ||||||
| 			// Per https://tools.ietf.org/html/rfc3986#page-21
 | 					s = s.right(i) | ||||||
| 			// in the host component %-encoding can only be used
 | 					if s.len > 3 { | ||||||
| 			// for non-ASCII bytes.
 | 						s = s.left(3) | ||||||
| 			// But https://tools.ietf.org/html/rfc6874#section-2
 | 					} | ||||||
| 			// introduces %25 being allowed to escape a percent sign
 | 					return error(error_msg(err_msg_escape, s)) | ||||||
| 			// in IPv6 scoped-address literals. Yay.
 |  | ||||||
| 			if mode == .encode_host && unhex(s[i+1]) < 8 && s.substr(i, i+3) != '%25' { |  | ||||||
| 				return error(error_msg(err_msg_escape, s.substr(i, i+3))) |  | ||||||
| 			} |  | ||||||
| 			if mode == .encode_zone { |  | ||||||
| 				// RFC 6874 says basically 'anything goes' for zone identifiers
 |  | ||||||
| 				// and that even non-ASCII can be redundantly escaped,
 |  | ||||||
| 				// but it seems prudent to restrict %-escaped bytes here to those
 |  | ||||||
| 				// that are valid host name bytes in their unescaped form.
 |  | ||||||
| 				// That is, you can use escaping in the zone identifier but not
 |  | ||||||
| 				// to introduce bytes you couldn't just write directly.
 |  | ||||||
| 				// But Windows puts spaces here! Yay.
 |  | ||||||
| 				v := byte(unhex(s[i+1])<<byte(4) | unhex(s[i+2])) |  | ||||||
| 				if s.substr(i, i+3) != '%25' && v != ` ` && should_escape(v, .encode_host) { |  | ||||||
| 					error(error_msg(err_msg_escape, s.substr(i, i+3))) |  | ||||||
| 				} | 				} | ||||||
|  | 				// Per https://tools.ietf.org/html/rfc3986#page-21
 | ||||||
|  | 				// in the host component %-encoding can only be used
 | ||||||
|  | 				// for non-ASCII bytes.
 | ||||||
|  | 				// But https://tools.ietf.org/html/rfc6874#section-2
 | ||||||
|  | 				// introduces %25 being allowed to escape a percent sign
 | ||||||
|  | 				// in IPv6 scoped-address literals. Yay.
 | ||||||
|  | 				if mode == .encode_host && unhex(s[i+1]) < 8 && s.substr(i, i+3) != '%25' { | ||||||
|  | 					return error(error_msg(err_msg_escape, s.substr(i, i+3))) | ||||||
|  | 				} | ||||||
|  | 				if mode == .encode_zone { | ||||||
|  | 					// RFC 6874 says basically 'anything goes' for zone identifiers
 | ||||||
|  | 					// and that even non-ASCII can be redundantly escaped,
 | ||||||
|  | 					// but it seems prudent to restrict %-escaped bytes here to those
 | ||||||
|  | 					// that are valid host name bytes in their unescaped form.
 | ||||||
|  | 					// That is, you can use escaping in the zone identifier but not
 | ||||||
|  | 					// to introduce bytes you couldn't just write directly.
 | ||||||
|  | 					// But Windows puts spaces here! Yay.
 | ||||||
|  | 					v := byte(unhex(s[i+1])<<byte(4) | unhex(s[i+2])) | ||||||
|  | 					if s.substr(i, i+3) != '%25' && v != ` ` && should_escape(v, .encode_host) { | ||||||
|  | 						error(error_msg(err_msg_escape, s.substr(i, i+3))) | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				i += 3 | ||||||
| 			} | 			} | ||||||
| 			i += 3 | 			 | ||||||
| 		case `+`: | 			`+`{ | ||||||
| 			has_plus = mode == .encode_query_component | 				has_plus = mode == .encode_query_component | ||||||
| 			i++ | 				i++ | ||||||
| 		default: | 			} else { | ||||||
| 			if (mode == .encode_host || mode == .encode_zone) && s[i] < 0x80 && should_escape(s[i], mode) { | 				if (mode == .encode_host || mode == .encode_zone) && s[i] < 0x80 && should_escape(s[i], mode) { | ||||||
| 				error(error_msg('invalid character in host name', s.substr(i, i+1))) | 					error(error_msg('invalid character in host name', s.substr(i, i+1))) | ||||||
|  | 				} | ||||||
|  | 				i++ | ||||||
| 			} | 			} | ||||||
| 			i++ |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -207,18 +211,20 @@ fn unescape(s_ string, mode EncodingMode) ?string { | ||||||
| 	mut t := strings.new_builder(s.len - 2*n) | 	mut t := strings.new_builder(s.len - 2*n) | ||||||
| 	for i := 0; i < s.len; i++ { | 	for i := 0; i < s.len; i++ { | ||||||
| 		x := s[i] | 		x := s[i] | ||||||
| 		switch x { | 		match x { | ||||||
| 		case `%`: | 			`%` { | ||||||
| 			t.write( byte(unhex(s[i+1])<<byte(4) | unhex(s[i+2])).str() ) | 				t.write( byte(unhex(s[i+1])<<byte(4) | unhex(s[i+2])).str() ) | ||||||
| 			i += 2 | 				i += 2 | ||||||
| 		case `+`: | 			} | ||||||
| 			if mode == .encode_query_component { | 			`+` { | ||||||
| 				t.write(' ') | 				if mode == .encode_query_component { | ||||||
| 			} else { | 					t.write(' ') | ||||||
| 				t.write('+') | 				} else { | ||||||
|  | 					t.write('+') | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				t.write(s[i].str()) | ||||||
| 			} | 			} | ||||||
| 		default: |  | ||||||
| 			t.write(s[i].str()) |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return t.str() | 	return t.str() | ||||||
|  | @ -694,16 +700,19 @@ fn valid_encoded_path(s string) bool { | ||||||
| 		// so we check the sub-delims ourselves and let
 | 		// so we check the sub-delims ourselves and let
 | ||||||
| 		// should_escape handle the others.
 | 		// should_escape handle the others.
 | ||||||
| 		x := s[i] | 		x := s[i] | ||||||
| 		switch x { | 		match x { | ||||||
| 		case `!`, `$`, `&`, `\\`, `(`, `)`, `*`, `+`, `,`, `;`, `=`, `:`, `@`: | 			`!`, `$`, `&`, `\\`, `(`, `)`, `*`, `+`, `,`, `;`, `=`, `:`, `@` { | ||||||
| 			// ok
 | 				// ok
 | ||||||
| 		case `[`, `]`: | 			} | ||||||
| 			// ok - not specified in RFC 3986 but left alone by modern browsers
 | 			`[`, `]` { | ||||||
| 		case `%`: | 				// ok - not specified in RFC 3986 but left alone by modern browsers
 | ||||||
| 			// ok - percent encoded, will decode
 | 			} | ||||||
| 		default: | 			`%` { | ||||||
| 			if should_escape(s[i], .encode_path) { | 				// ok - percent encoded, will decode
 | ||||||
| 				return false | 			} else { | ||||||
|  | 				if should_escape(s[i], .encode_path) { | ||||||
|  | 					return false | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -914,15 +923,17 @@ fn resolve_path(base, ref string) string { | ||||||
| 	mut dst := []string | 	mut dst := []string | ||||||
| 	src := full.split('/') | 	src := full.split('/') | ||||||
| 	for _, elem in src { | 	for _, elem in src { | ||||||
| 		switch elem { | 		match elem { | ||||||
| 		case '.': | 			'.' { | ||||||
| 			// drop
 | 				// drop
 | ||||||
| 		case '..': | 			} | ||||||
| 			if dst.len > 0 { | 			'..' { | ||||||
| 				dst = dst.left(dst.len-1) | 				if dst.len > 0 { | ||||||
|  | 					dst = dst.left(dst.len-1) | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				dst << elem | ||||||
| 			} | 			} | ||||||
| 		default: |  | ||||||
| 			dst << elem |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	last := src[src.len-1] | 	last := src[src.len-1] | ||||||
|  | @ -1069,12 +1080,13 @@ pub fn valid_userinfo(s string) bool { | ||||||
| 		if `0` <= r && r <= `9` { | 		if `0` <= r && r <= `9` { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		switch r { | 		match r { | ||||||
| 		case `-`, `.`, `_`, `:`, `~`, `!`, `$`, `&`, `\\`, | 				`-`, `.`, `_`, `:`, `~`, `!`, `$`, `&`, `\\`, | ||||||
| 			`(`, `)`, `*`, `+`, `,`, `;`, `=`, `%`, `@`: | 				`(`, `)`, `*`, `+`, `,`, `;`, `=`, `%`, `@` { | ||||||
| 			continue | 					continue | ||||||
| 		default: | 				} else { | ||||||
| 			return false | 					return false | ||||||
|  | 				} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return true | 	return true | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue