| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- // Copyright 2018 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- // Package httpguts provides functions implementing various details
- // of the HTTP specification.
- //
- // This package is shared by the standard library (which vendors it)
- // and x/net/http2. It comes with no API stability promise.
- package httpguts
- import (
- "net/textproto"
- "strings"
- )
- // SniffedContentType reports whether ct is a Content-Type that is known
- // to cause client-side content sniffing.
- //
- // This provides just a partial implementation of mime.ParseMediaType
- // with the assumption that the Content-Type is not attacker controlled.
- func SniffedContentType(ct string) bool {
- if i := strings.Index(ct, ";"); i != -1 {
- ct = ct[:i]
- }
- ct = strings.ToLower(strings.TrimSpace(ct))
- return ct == "text/plain" || ct == "application/octet-stream" ||
- ct == "application/unknown" || ct == "unknown/unknown" || ct == "*/*" ||
- !strings.Contains(ct, "/")
- }
- // ValidTrailerHeader reports whether name is a valid header field name to appear
- // in trailers.
- // See RFC 7230, Section 4.1.2
- func ValidTrailerHeader(name string) bool {
- name = textproto.CanonicalMIMEHeaderKey(name)
- if strings.HasPrefix(name, "If-") || badTrailer[name] {
- return false
- }
- return true
- }
- var badTrailer = map[string]bool{
- "Authorization": true,
- "Cache-Control": true,
- "Connection": true,
- "Content-Encoding": true,
- "Content-Length": true,
- "Content-Range": true,
- "Content-Type": true,
- "Expect": true,
- "Host": true,
- "Keep-Alive": true,
- "Max-Forwards": true,
- "Pragma": true,
- "Proxy-Authenticate": true,
- "Proxy-Authorization": true,
- "Proxy-Connection": true,
- "Range": true,
- "Realm": true,
- "Te": true,
- "Trailer": true,
- "Transfer-Encoding": true,
- "Www-Authenticate": true,
- }
|