Writing http response from an second goroutine

Issue

I’ve been playing around with the spotify api and came to an Problem. context.Context gets used and therefore the functions just "randomly" execute. The OAuth function should check if the Code is invalid but If I don’t do this with an channel the last part of the code gets executed directly without even the first/second function finishing. Because of that I made an second goroutine that checks if the channel is received and then write an response. But now I get this error http: wrote more than the declared Content-Length how can I correct the Content-Lenght? Why is context even used?

My Code:

// Wrapper: github.com/zmb3/spotify/v2

func WriteResponse(w http.ResponseWriter, h chan *spotify.Client) {

    client := <-h

    user, err := client.CurrentUser(context.Background())
    fmt.Println(user.User.DisplayName)
    if err != nil {
        _, err := fmt.Fprint(w, "Couldn't get user sorry :(")
        if err != nil {
            return
        }
    }
    _, err = fmt.Fprintf(w, "Logged in as %s!", user.User.DisplayName)
    if err != nil {
        log.Println(err)
        return
    }
}

func OAuth(w http.ResponseWriter, r *http.Request) {
    ch := make(chan *spotify.Client)

    tok, err := auth.Token(r.Context(), state, r)
    if err != nil {
        w.WriteHeader(503)
        _, err := fmt.Fprint(w, "Couldn't get token sorry :(")
        if err != nil {
            return
        }
    }

    if st := r.FormValue("state"); st != state {
        http.NotFound(w,r)
        log.Fatalf("State mismatch: %s != %s\n", st, state)
    }

    go WriteResponse(w, ch)
    client := spotify.New(auth.Client(r.Context(), tok))

    ch <- client
}

Solution

You forgot to return..

if err != nil {
        w.WriteHeader(503)
        _, err := fmt.Fprint(w, "Couldn't get token sorry :(")
        if err != nil {
            return
        }
        // here
        return
    }

Answered By – Spoofed

Answer Checked By – Robin (GoLangFix Admin)

Leave a Reply

Your email address will not be published.