fix: curl async http client empty-valued header#2953
Open
curme wants to merge 1 commit intotornadoweb:masterfrom
Open
fix: curl async http client empty-valued header#2953curme wants to merge 1 commit intotornadoweb:masterfrom
curme wants to merge 1 commit intotornadoweb:masterfrom
Conversation
bdarnell
reviewed
Nov 19, 2020
Member
bdarnell
left a comment
There was a problem hiding this comment.
This functionality needs a test to demonstrate that it's working correctly (and curl is translating the semicolon into a colon for the server's consumption). A test in httpclient_test would also verify that simple_httpclient is handling this edge case correctly.
It would be nice to link to the docs for CURLOPT_HTTPHEADER because the syntax used by this feature is quite surprising.
| pycurl.HTTPHEADER, | ||
| [ | ||
| "%s: %s" % (native_str(k), native_str(v)) | ||
| if v is not '' else "%s;" % native_str(k) |
Member
There was a problem hiding this comment.
This should be != (or just if v), not is not. The use of is here is relying on interning of small strings which I believe is an undocumented implementation detail.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Behavior
I found that some of the requests I sent by tornado would lose part of headers, exactly the empty-valued ones.
For example, when posting a request with headers
{'Content-Type': "application/json", 'Authorization': ""}, only headerContent-Typewill be sent out actually, with the headerAuthorizationdropped because it's empty.For some requests, header with blank content is indispensable. In my case, I met an odd server must make sure there is an
Authorizationin headers even it is blank.Reason
The behavior caused by the way curl-http-client constructing headers, which converting all of headers in "%s: %s" format. The headers having no value, such as 'xxxx: ', would be removed by cURL.
To keep those headers in request, the colon should be replaced with semicolon, such as 'xxxx;'. libcurl examples