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

net/http: Transfer-Encoding header is missing in headers (http.Request) #27061

Open
subbu05 opened this issue Aug 17, 2018 · 6 comments
Open
Labels
NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Milestone

Comments

@subbu05
Copy link

subbu05 commented Aug 17, 2018

Transfer-Encoding header is missing when http.Request.Header is printed/accessed.

What version of Go are you using (go version)?

go version go1.10.3 darwin/amd64

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (go env)?

GOARCH="amd64"
GOBIN="/Users/user/go/bin"
GOCACHE="/Users/sumalepa/Library/Caches/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="linux"
GOPATH="/Users/user/go"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.10.3/libexec"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.10.3/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="0"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/76/trlnwqwj0bs5003x850kzpg00000gn/T/go-build494326801=/tmp/go-build -gno-record-gcc-switches"

What did you do?

We have a nginx server that routes the requests to go based http server.

https://play.golang.org/p/EA1vcoiFi_J

What did you expect to see?

We expected to see the header Transfer-Encoding

What did you see instead?

Missing header Transfer-Encoding

Few Details:
Http-Client (User-Agent [Go-http-client/1.1]) -> Nginx -> Http server (Go based server)
Sent a PUT request from client with chunked encoding header to nginx in turn nginx sends the request to http server.
I was able to see the headers in the pcap dumps captured at client, nginx. But on go http server I didn't the header.

But in the go http server output I didn't see the Transfer-Encoding header.
As a part of debug process I replaces go http server with python http server. I was able to see the Transfer-Encoding header on http python server.

@subbu05
Copy link
Author

subbu05 commented Aug 17, 2018

Python web server code

#!/usr/bin/env python
"""
Very simple HTTP server in python.
Usage::
    ./dummy-web-server.py [<port>]
Send a GET request::
    curl http://localhost
Send a HEAD request::
    curl -I http://localhost
Send a POST request::
    curl -d "foo=bar&bin=baz" http://localhost
"""
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import SocketServer

class S(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        self._set_headers()
        self.wfile.write("<html><body><h1>hi!</h1></body></html>")

    def do_HEAD(self):
        self._set_headers()

    def do_PUT(self):
	request_path = self.path

        print("\n----- Request Start ----->\n")
        print(request_path)
        request_headers = self.headers
        print(request_headers)
        print("<----- Request End -----\n")
        self.send_response(200)

def run(server_class=HTTPServer, handler_class=S, port=9777):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print 'Starting httpd...'
    httpd.serve_forever()

if __name__ == "__main__":
    from sys import argv

    if len(argv) == 2:
        run(port=int(argv[1]))
    else:
        run()

@andybons andybons added the NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. label Aug 17, 2018
@andybons andybons added this to the Unplanned milestone Aug 17, 2018
@fraenkel
Copy link
Contributor

Transfer-Encoding is a hop by hop header. https://tools.ietf.org/html/rfc2616#section-13.5.1

@agnivade
Copy link
Contributor

agnivade commented Feb 3, 2019

/cc @bradfitz

@agnivade agnivade changed the title Transfer-Encoding header is missing in headers (http.Request) net/http: Transfer-Encoding header is missing in headers (http.Request) Feb 3, 2019
@bradfitz
Copy link
Contributor

bradfitz commented Feb 3, 2019

See the http.Request docs. (on phone, so no link)

@agnivade
Copy link
Contributor

agnivade commented Feb 4, 2019

@bradfitz - Do you mean Transfer-Encoding is also included in "certain headers" ?

https://golang.org/pkg/net/http/#Request

// For client requests, certain headers such as Content-Length
// and Connection are automatically written when needed and
// values in Header may be ignored.

@halegreen
Copy link

I got transfer-encoding header missing in http response header by using the following code to complete request.
While using curl to the same URL is OK, but don't know why ?

	client := &http.Client{}
	resp, err := client.Get(url)
	if err != nil {
		fmt.Errorf("%v", err)
	} else {
		for k, v := range resp.Header {
			fmt.Printf("k:%s, v:%s \n", k, v)
		}
	}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Projects
None yet
Development

No branches or pull requests

6 participants