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

fix: ignoring response header field space #1921

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions header.go
Original file line number Diff line number Diff line change
Expand Up @@ -3011,12 +3011,20 @@ func (h *ResponseHeader) parseHeaders(buf []byte) (int, error) {
return 0, fmt.Errorf("invalid header key %q", s.key)
}

spaceIncluded := false
for _, ch := range s.key {
if !validHeaderFieldByte(ch) {
if ch == ' ' {
spaceIncluded = true
break
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If there are invalid characters after space, the validHeaderField will be skipped. I think break should be changed to continue.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you're right. I didn't think that...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed! Thank you!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wait a minute... Come to think of it, I'm going to ignore it anyway, but do we still need validation? If we need validation of the header key, don't we need validation of the header value?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there are two choices, one is to validate both the key and the value because if there is the wrong byte, it should fail, and the other is not to do it after have checked the space. And wouldn't it be right not to validate it for fasthttp? I think it would be better to skip the minor verification.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In net/http, they handle headers even if they contain spaces. I just realized that you directly ignore this header field. Although I think we should follow the behavior with net/http instead of skipping this header.

We can ask @erikdubbelboer for his opinion.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wanted to follow that action if possible, but net/http doesn't canonicalize the header afterwards, but fasthttp normalizes it through disableNormalizing, so I decided to just ignore it. This is also because it is a common behavior for Internet browsers. If you have any ideas, please let me know.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also prefer it if we follow the behavior of net/http as that is really well tested.

}
h.connectionClose = true
return 0, fmt.Errorf("invalid header key %q", s.key)
}
}
if spaceIncluded {
continue
}
for _, ch := range s.value {
if !validHeaderValueByte(ch) {
h.connectionClose = true
Expand Down