Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RequestHeader support set no default ContentType #1218

Merged
merged 1 commit into from Feb 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 11 additions & 4 deletions header.go
Expand Up @@ -59,9 +59,10 @@ type ResponseHeader struct {
type RequestHeader struct {
noCopy noCopy //nolint:unused,structcheck

disableNormalizing bool
noHTTP11 bool
connectionClose bool
disableNormalizing bool
noHTTP11 bool
connectionClose bool
noDefaultContentType bool

// These two fields have been moved close to other bool fields
// for reducing RequestHeader object size.
Expand Down Expand Up @@ -943,9 +944,15 @@ func (h *ResponseHeader) resetSkipNormalize() {
h.trailer = h.trailer[:0]
}

// SetNoDefaultContentType allows you to control if a default Content-Type header will be set (false) or not (true).
func (h *RequestHeader) SetNoDefaultContentType(noDefaultContentType bool) {
h.noDefaultContentType = noDefaultContentType
}

// Reset clears request header.
func (h *RequestHeader) Reset() {
h.disableNormalizing = false
h.SetNoDefaultContentType(false)
h.resetSkipNormalize()
}

Expand Down Expand Up @@ -2273,7 +2280,7 @@ func (h *RequestHeader) AppendBytes(dst []byte) []byte {
}

contentType := h.ContentType()
if len(contentType) == 0 && !h.ignoreBody() {
if !h.noDefaultContentType && len(contentType) == 0 && !h.ignoreBody() {
contentType = strDefaultContentType
}
if len(contentType) > 0 {
Expand Down
27 changes: 27 additions & 0 deletions header_test.go
Expand Up @@ -1381,6 +1381,33 @@ func TestRequestContentTypeDefaultNotEmpty(t *testing.T) {
}
}

func TestRequestContentTypeNoDefault(t *testing.T) {
t.Parallel()

var h RequestHeader
h.SetMethod(MethodDelete)
h.SetNoDefaultContentType(true)

w := &bytes.Buffer{}
bw := bufio.NewWriter(w)
if err := h.Write(bw); err != nil {
t.Fatalf("Unexpected error: %s", err)
}
if err := bw.Flush(); err != nil {
t.Fatalf("Unexpected error: %s", err)
}

var h1 RequestHeader
br := bufio.NewReader(w)
if err := h1.Read(br); err != nil {
t.Fatalf("Unexpected error: %s", err)
}

if string(h1.contentType) != "" {
t.Fatalf("unexpected Content-Type %q. Expecting %q", h1.contentType, "")
}
}

func TestResponseDateNoDefaultNotEmpty(t *testing.T) {
t.Parallel()

Expand Down