header.go
func (h *RequestHeader) SetCanonical(key, value []byte) {
	h.parseRawHeaders()
	switch string(key) {
	case "Host":
		h.SetHostBytes(value)
	case "Content-Type":
		h.SetContentTypeBytes(value)
	case "User-Agent":
		h.SetUserAgentBytes(value)
	case "Cookie":
		h.collectCookies()
		h.cookies = parseRequestCookies(h.cookies, value)
	case "Content-Length":
		if contentLength, err := parseContentLength(value); err == nil {
			h.contentLength = contentLength
			h.contentLengthBytes = append(h.contentLengthBytes[:0], value...)
		}
	case "Connection":
		if bytes.Equal(strClose, value) {
			h.SetConnectionClose()
		} else {
			h.ResetConnectionClose()
			h.h = setArgBytes(h.h, key, value, argsHasValue)
		}
	case "Transfer-Encoding":
		// Transfer-Encoding is managed automatically.
	default:
		h.h = setArgBytes(h.h, key, value, argsHasValue)
	}
}
func (h *RequestHeader) SetCanonical(key, value []byte) {
	h.parseRawHeaders()
	switch string(key) {
	case "Host":
		h.SetHostBytes(value)
	case "Content-Type":
		h.SetContentTypeBytes(value)
	case "User-Agent":
		h.SetUserAgentBytes(value)
	case "Cookie":
		h.collectCookies()
		h.cookies = parseRequestCookies(h.cookies, value)
	case "Content-Length":
		if contentLength, err := parseContentLength(value); err == nil {
			h.contentLength = contentLength
			h.contentLengthBytes = append(h.contentLengthBytes[:0], value...)
		}
	case "Connection":
		if bytes.Equal(strClose, value) {
			h.SetConnectionClose()
		} else {
			h.ResetConnectionClose()
			h.h = setArgBytes(h.h, key, value, argsHasValue)
		}
	case "Transfer-Encoding":
		// Transfer-Encoding is managed automatically.
	default:
		h.h = setArgBytes(h.h, key, value, argsHasValue)
	}
}
// SetCanonical sets the given 'key: value' header assuming that
// key is in canonical form.