Re: [go-nuts] net/http: Redirect writes HTML for GET requests without setting Content-Type, how come?

2017-09-04 Thread Dmitri Shuralyov
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?

2017-07-22 Thread Dmitri Shuralyov
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?

2017-07-22 Thread Matt Harden
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+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?

2017-07-18 Thread Dmitri Shuralyov
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.