Re: [go-nuts] net/http: Redirect writes HTML for GET requests without setting Content-Type, how come?
Quick followup note here. The CL that resolves this issue has been merged, and should be a part of Go 1.10 release. On Saturday, July 22, 2017 at 11:46:40 PM UTC-4, Dmitri Shuralyov wrote: > > Thanks Matt, that corroborates with my understanding too. > > I've sent a CL https://go-review.googlesource.com/c/50510 to fix it, it > can be reviewed after the tree unfreezes. > > > (perhaps only if it's not already set?) > > It's good to think this through, but I don't think it's worth checking for > that. http.Redirect is meant to be used to a fresh request, one that hasn't > been dealt with. We can't do much if the user misuses it. E.g., imagine if > they set a different content-type and write some text, then call > http.Redirect. It won't be able to set the correct status code, since the > status code gets written as soon as you write some bytes to the > http.ResponseWriter. > > > On Saturday, July 22, 2017 at 11:27:43 PM UTC-4, Matt Harden wrote: >> >> That sounds like a bug. The whole reason for including a message is for >> older user-agents that don't understand redirects (must be *really* old! >> So the Content-Type should be set as if responding normally to a GET >> request. I think Redirect should be setting Content-Type (perhaps only if >> it's not already set?). >> >> On Tue, Jul 18, 2017 at 8:41 PM Dmitri Shuralyov>> wrote: >> >>> I've written a little middleware to help catch instances where I write >>> some content in an HTTP handler, but forget to set the Content-Type header. >>> I prefer to always set it to avoid forcing the browser to guess. It feels >>> good and produces more predictable results. >>> >>> I've noticed some of my redirect responses being marked as not having >>> Content-Type header. >>> >>> This is because of the implementation of http.Redirect: >>> >>> >>> https://github.com/golang/go/blob/83fb9c8d9f5511f5aca2a0eb9f7507e2527a76a9/src/net/http/server.go#L1961-L2022 >>> >>> It includes the following snippet: >>> >>> // RFC 2616 recommends that a short note "SHOULD" be included in the >>> // response because older user agents may not understand 301/307. >>> // Shouldn't send the response for POST or HEAD; that leaves GET. >>> if r.Method == "GET" { >>> note := "" + statusText[code] + >>> ".\n" >>> fmt.Fprintln(w, note) >>> } >>> >>> So if the method is GET, it writes a note that looks like HTML... But it >>> doesn't set a Content-Type. >>> >>> Given my desire to be explicit about setting Content-Types, should I >>> always use http.Redirect as follows: >>> >>> if r.Method == "GET" { >>> w.Header().Set("Content-Type", "text/html; charset=utf-8") >>> } >>> http.Redirect(w, req, targetURL, http.StatusSeeOther) >>> >>> Or is this something that http.Redirect should be doing itself? >>> >>> Or is it fine not to set Content-Type header in the case of a redirect >>> status code? If so, why is that? >>> >>> Thanks. >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [go-nuts] net/http: Redirect writes HTML for GET requests without setting Content-Type, how come?
Thanks Matt, that corroborates with my understanding too. I've sent a CL https://go-review.googlesource.com/c/50510 to fix it, it can be reviewed after the tree unfreezes. > (perhaps only if it's not already set?) It's good to think this through, but I don't think it's worth checking for that. http.Redirect is meant to be used to a fresh request, one that hasn't been dealt with. We can't do much if the user misuses it. E.g., imagine if they set a different content-type and write some text, then call http.Redirect. It won't be able to set the correct status code, since the status code gets written as soon as you write some bytes to the http.ResponseWriter. On Saturday, July 22, 2017 at 11:27:43 PM UTC-4, Matt Harden wrote: > > That sounds like a bug. The whole reason for including a message is for > older user-agents that don't understand redirects (must be *really* old! > So the Content-Type should be set as if responding normally to a GET > request. I think Redirect should be setting Content-Type (perhaps only if > it's not already set?). > > On Tue, Jul 18, 2017 at 8:41 PM Dmitri Shuralyov> wrote: > >> I've written a little middleware to help catch instances where I write >> some content in an HTTP handler, but forget to set the Content-Type header. >> I prefer to always set it to avoid forcing the browser to guess. It feels >> good and produces more predictable results. >> >> I've noticed some of my redirect responses being marked as not having >> Content-Type header. >> >> This is because of the implementation of http.Redirect: >> >> >> https://github.com/golang/go/blob/83fb9c8d9f5511f5aca2a0eb9f7507e2527a76a9/src/net/http/server.go#L1961-L2022 >> >> It includes the following snippet: >> >> // RFC 2616 recommends that a short note "SHOULD" be included in the >> // response because older user agents may not understand 301/307. >> // Shouldn't send the response for POST or HEAD; that leaves GET. >> if r.Method == "GET" { >> note := "" + statusText[code] + >> ".\n" >> fmt.Fprintln(w, note) >> } >> >> So if the method is GET, it writes a note that looks like HTML... But it >> doesn't set a Content-Type. >> >> Given my desire to be explicit about setting Content-Types, should I >> always use http.Redirect as follows: >> >> if r.Method == "GET" { >> w.Header().Set("Content-Type", "text/html; charset=utf-8") >> } >> http.Redirect(w, req, targetURL, http.StatusSeeOther) >> >> Or is this something that http.Redirect should be doing itself? >> >> Or is it fine not to set Content-Type header in the case of a redirect >> status code? If so, why is that? >> >> Thanks. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts...@googlegroups.com . >> For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [go-nuts] net/http: Redirect writes HTML for GET requests without setting Content-Type, how come?
That sounds like a bug. The whole reason for including a message is for older user-agents that don't understand redirects (must be *really* old! So the Content-Type should be set as if responding normally to a GET request. I think Redirect should be setting Content-Type (perhaps only if it's not already set?). On Tue, Jul 18, 2017 at 8:41 PM Dmitri Shuralyovwrote: > I've written a little middleware to help catch instances where I write > some content in an HTTP handler, but forget to set the Content-Type header. > I prefer to always set it to avoid forcing the browser to guess. It feels > good and produces more predictable results. > > I've noticed some of my redirect responses being marked as not having > Content-Type header. > > This is because of the implementation of http.Redirect: > > > https://github.com/golang/go/blob/83fb9c8d9f5511f5aca2a0eb9f7507e2527a76a9/src/net/http/server.go#L1961-L2022 > > It includes the following snippet: > > // RFC 2616 recommends that a short note "SHOULD" be included in the > // response because older user agents may not understand 301/307. > // Shouldn't send the response for POST or HEAD; that leaves GET. > if r.Method == "GET" { > note := "" + statusText[code] + > ".\n" > fmt.Fprintln(w, note) > } > > So if the method is GET, it writes a note that looks like HTML... But it > doesn't set a Content-Type. > > Given my desire to be explicit about setting Content-Types, should I > always use http.Redirect as follows: > > if r.Method == "GET" { > w.Header().Set("Content-Type", "text/html; charset=utf-8") > } > http.Redirect(w, req, targetURL, http.StatusSeeOther) > > Or is this something that http.Redirect should be doing itself? > > Or is it fine not to set Content-Type header in the case of a redirect > status code? If so, why is that? > > Thanks. > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
[go-nuts] net/http: Redirect writes HTML for GET requests without setting Content-Type, how come?
I've written a little middleware to help catch instances where I write some content in an HTTP handler, but forget to set the Content-Type header. I prefer to always set it to avoid forcing the browser to guess. It feels good and produces more predictable results. I've noticed some of my redirect responses being marked as not having Content-Type header. This is because of the implementation of http.Redirect: https://github.com/golang/go/blob/83fb9c8d9f5511f5aca2a0eb9f7507e2527a76a9/src/net/http/server.go#L1961-L2022 It includes the following snippet: // RFC 2616 recommends that a short note "SHOULD" be included in the // response because older user agents may not understand 301/307. // Shouldn't send the response for POST or HEAD; that leaves GET. if r.Method == "GET" { note := "" + statusText[code] + ".\n" fmt.Fprintln(w, note) } So if the method is GET, it writes a note that looks like HTML... But it doesn't set a Content-Type. Given my desire to be explicit about setting Content-Types, should I always use http.Redirect as follows: if r.Method == "GET" { w.Header().Set("Content-Type", "text/html; charset=utf-8") } http.Redirect(w, req, targetURL, http.StatusSeeOther) Or is this something that http.Redirect should be doing itself? Or is it fine not to set Content-Type header in the case of a redirect status code? If so, why is that? Thanks. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.