From 9016476f2a5051fd72dbe35d0c7bce13b4b6d55b Mon Sep 17 00:00:00 2001 From: Vidhu Kant Sharma Date: Fri, 24 Nov 2023 20:10:31 +0530 Subject: not prematurely killing the server before showing message in browser upon login --- auth/server.go | 60 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 19 deletions(-) (limited to 'auth/server.go') diff --git a/auth/server.go b/auth/server.go index 0f2496e..5bce2aa 100644 --- a/auth/server.go +++ b/auth/server.go @@ -19,51 +19,73 @@ along with this program. If not, see . package auth import ( + "context" "net/http" "net/url" + "html" "encoding/json" "os" "fmt" + "errors" ) func listen(clientId, verifier string) { - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - code, codeExists := r.URL.Query()["code"] + mux := http.NewServeMux() + server := &http.Server{Addr: ":8000", Handler: mux} + + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + code, codeExists := r.URL.Query()["code"] if codeExists { - accessToken, refreshToken, expiresIn := requestToken(clientId, verifier, code[0]) - setToken(accessToken) - setRefreshToken(refreshToken) - setExpiresIn(expiresIn) - fmt.Println("\x1b[32mYou have successfully logged into macli.\x1b[0m") - fmt.Println("\x1b[32mYou can close the web browser tab now.\x1b[0m") - os.Exit(0) + err := getToken(clientId, verifier, code[0]) + if err != nil { + fmt.Fprintf(w, "

An error occoured while logging in: %s

", html.EscapeString(err.Error())) + + fmt.Println("Error while requesting an access token from MyAnimeList:", err) + } else { + fmt.Fprintf(w, "

Login successful! You may close this tab now.

") + + fmt.Println("\x1b[32mYou have successfully logged into macli.\x1b[0m") + fmt.Println("\x1b[32mYou can close the web browser tab now.\x1b[0m") + } + } else { + fmt.Fprintf(w, "

An error occoured while logging in (invalid request)

") + + fmt.Println("An error occoured while logging in (invalid request)") } + + go server.Shutdown(context.Background()) }) - err := http.ListenAndServe(":8000", nil) - if err != nil { + err := server.ListenAndServe() + if err != nil && err != http.ErrServerClosed { fmt.Println("There was an error initialising the server", err.Error()) os.Exit(1) } } -func requestToken(clientId, verifier, code string) (string, string, string) { +func getToken(clientId, verifier, code string) error { data := url.Values{ - "client_id": {clientId}, - "code_verifier": {verifier}, - "grant_type": {"authorization_code"}, - "code": {code}, + "client_id": {clientId}, + "code_verifier": {verifier}, + "grant_type": {"authorization_code"}, + "code": {code}, } resp, err := http.PostForm("https://myanimelist.net/v1/oauth2/token", data) if err != nil { - fmt.Println("Error while requesting an access token:", err) - os.Exit(1) + return err } var res map[string]interface{} json.NewDecoder(resp.Body).Decode(&res) - return fmt.Sprintf("%v", res["access_token"]), fmt.Sprintf("%v", res["refresh_token"]), fmt.Sprintf("%v", res["expires_in"]) + if res["error"] != nil { + return errors.New(fmt.Sprintf("%v (%v)", res["message"], res["error"])) + } + + setToken(fmt.Sprintf("%v", res["access_token"])) + //setRefreshToken(refreshToken) + //setExpiresIn(expiresIn) + return nil } -- cgit v1.2.3