gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

ascii.go (1378B)


      1 // Copyright 2021 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 http2
      6 
      7 import "strings"
      8 
      9 // The HTTP protocols are defined in terms of ASCII, not Unicode. This file
     10 // contains helper functions which may use Unicode-aware functions which would
     11 // otherwise be unsafe and could introduce vulnerabilities if used improperly.
     12 
     13 // asciiEqualFold is strings.EqualFold, ASCII only. It reports whether s and t
     14 // are equal, ASCII-case-insensitively.
     15 func asciiEqualFold(s, t string) bool {
     16 	if len(s) != len(t) {
     17 		return false
     18 	}
     19 	for i := 0; i < len(s); i++ {
     20 		if lower(s[i]) != lower(t[i]) {
     21 			return false
     22 		}
     23 	}
     24 	return true
     25 }
     26 
     27 // lower returns the ASCII lowercase version of b.
     28 func lower(b byte) byte {
     29 	if 'A' <= b && b <= 'Z' {
     30 		return b + ('a' - 'A')
     31 	}
     32 	return b
     33 }
     34 
     35 // isASCIIPrint returns whether s is ASCII and printable according to
     36 // https://tools.ietf.org/html/rfc20#section-4.2.
     37 func isASCIIPrint(s string) bool {
     38 	for i := 0; i < len(s); i++ {
     39 		if s[i] < ' ' || s[i] > '~' {
     40 			return false
     41 		}
     42 	}
     43 	return true
     44 }
     45 
     46 // asciiToLower returns the lowercase version of s if s is ASCII and printable,
     47 // and whether or not it was.
     48 func asciiToLower(s string) (lower string, ok bool) {
     49 	if !isASCIIPrint(s) {
     50 		return "", false
     51 	}
     52 	return strings.ToLower(s), true
     53 }