Go API receive calls twice when hit through browser

680 views
Skip to first unread message

smartaq...@gmail.com

unread,
Sep 25, 2020, 5:52:27 AM9/25/20
to golang-nuts
Team,

Hi all, hope you are doing good.

I've made a hosted a small api on my windows 10 enterprise machine:

```
func main() {
    srv := &http.Server{Addr: ":8000", Handler: http.HandlerFunc(handle)}
   log.Fatal(srv.ListenAndServeTLS("certificate.crt", "certificate.key"))
}

func handle(w http.ResponseWriter, r *http.Request) {
    // Log the request protocol
    log.Printf("Got connection: %s", r.Proto)
   
   // Send a message back to the client
    w.Write([]byte("Hello"))
}
```
The moment I call this api using different browsers(IE/Chrome)(https://localhost:8000) or curl request I receive these kind of outputs:
  1. In browser I receive "Hello" which is correct
  2. In golang console prompt I get this log twice: 
    With TLS:
    Capture.PNG
    Without TLS:
    Capture.PNG
    Capture.PNG

  3. But, while making a curl request I get this log & only once: 
    Capture.PNG
What is the difference between point 2 & 3. I've tried both tls and non tls version with browsers but in both the cases logs are coming twice. I don't know why this favicon.ico call is going.

Am I missing something here. Please help. Thank you

Gregor Best

unread,
Sep 25, 2020, 6:32:42 AM9/25/20
to smartaq...@gmail.com, golang-nuts
One of the requests is likely the browser looking for /favicon.ico.

In cases like this (wondering "what are these requests?") it's usually a
good idea to log things like the actual request URI used and the request
method.

On 25.09.20 11:30, smartaq...@gmail.com wrote:
> Team,
>
> Hi all, hope you are doing good.
>
> I've made a small poc api on my windows 10 enterprise machine
>
> ```
> func main() {
>     srv := &http.Server{Addr: ":8000", Handler: http.HandlerFunc(handle)}
>    log.Fatal(srv.ListenAndServeTLS("certificate.crt", "certificate.key"))
> }
>
> func handle(w http.ResponseWriter, r *http.Request) {
>     // Log the request protocol
>     log.Printf("Got connection: %s", r.Proto)
>
>    // Send a message back to the client
>     w.Write([]byte("Hello"))
> }
> ```
> The moment I call this api using different
> browsers(IE/Chrome)(https://localhost:8000) or curl request I receive
> these kind of outputs:
>
> 1. In browser I receive "Hello" which is correct
> 2. In golang console prompt I get this log twice:  Got connection: HTTP/2.0
>
> Without TLS:
>
>
>
> 3. But, while making a curl request I get this log & only once:
>
> What is the difference between point 2 & 3. I've tried both tls and non
> tls version with browsers but in both the cases logs are coming twice. I
> don't know why this favicon.ico call is going.
>
> Am I missing something here. Please help. Thank you
>
> --
> 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
> <mailto:golang-nuts...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/216a565e-5fae-4e41-b5fb-7af3ff735fc3n%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/216a565e-5fae-4e41-b5fb-7af3ff735fc3n%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
Gregor Best
be...@pferdewetten.de

gaurav...@gmail.com

unread,
Sep 25, 2020, 1:35:27 PM9/25/20
to golang-nuts
First request must be OPTION and second must be GET/ POST , This is default browser behaviour.

Joop Kiefte

unread,
Sep 25, 2020, 1:46:55 PM9/25/20
to gaurav...@gmail.com, golan...@googlegroups.com
The browser tries to put a nice icon to the side of the link. Usually this can be accomplished with a meta tag, but the browser also tries the well-known location favicon.ico to retrieve it if there is no meta-tag. That's why you see two requests.
--
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.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/7da5a20a-1661-4b1d-ac5b-074a12208622n%40googlegroups.com.

smartaq...@gmail.com

unread,
Sep 27, 2020, 12:28:17 PM9/27/20
to golang-nuts
Thank you for the reply. Is there anyway to stop it completely or its the default behavior of all the browsers. It is an api and not any web page due to which adding a meta tag is not possible i think so. 

I've checked on google, and people are just returning a 200 status, when browser ask for favicon, in case of api's so that at least error should not return. 

Joop Kiefte

unread,
Sep 27, 2020, 1:14:17 PM9/27/20
to smartaq...@gmail.com, golan...@googlegroups.com
probably the best solution is to use the handlers and not listen on any other link than your API links, then the favicon request won't hit your service. You don't even really have to return a 200, just make sure you don't answer to favicon.ico requests the very least.

pb5j9

Joop Kiefte

unread,
Sep 27, 2020, 1:15:01 PM9/27/20
to smartaq...@gmail.com, golan...@googlegroups.com
mind: there are more well-known locations, they are just not as common as the favicon call, so you might just want to be specific on where you expect your API calls and only listen on that.

pb5kd

smartaq...@gmail.com

unread,
Sep 27, 2020, 3:08:37 PM9/27/20
to golang-nuts
Thanks a lot. It is working now. After giving the API link it is making the request to the specified one only. Thank you for the help.
Reply all
Reply to author
Forward
0 new messages