お世話になります。低レベルな質問かもしれませんが、解決したいので質問させてください。
こちらのコードでは、 main()の中でrootHandler(loginHandler)
とすることで内部でServeHTTPが呼ばれているようです。
しかし、なぜ勝手に呼ばれるのでしょうか?どこがどうなって呼ばれる仕組みになっているのか教えていただきたいです。
よろしくお願いいたします。
Go
1 2// Use as a wrapper around the handler functions. 3type rootHandler func(http.ResponseWriter, *http.Request) error 4 5func loginHandler(w http.ResponseWriter, r *http.Request) error { 6 if r.Method != http.MethodPost { 7 return NewHTTPError(nil, 405, "Method not allowed.") 8 } 9 10 body, err := ioutil.ReadAll(r.Body) // Read request body. 11 if err != nil { 12 return fmt.Errorf("Request body read error : %v", err) 13 } 14 15 // Parse body as json. 16 var schema loginSchema 17 if err = json.Unmarshal(body, &schema); err != nil { 18 return NewHTTPError(err, 400, "Bad request : invalid JSON.") 19 } 20 21 ok, err := loginUser(schema.Username, schema.Password) 22 if err != nil { 23 return fmt.Errorf("loginUser DB error : %v", err) 24 } 25 26 if !ok { // Authentication failed. 27 return NewHTTPError(nil, 401, "Wrong password or username.") 28 } 29 w.WriteHeader(200) // Successfully authenticated. Return access token? 30 return nil 31} 32 33// rootHandler implements http.Handler interface. 34func (fn rootHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 35 err := fn(w, r) // Call handler function 36 if err == nil { 37 return 38 } 39 // This is where our error handling logic starts. 40 log.Printf("An error accured: %v", err) // Log the error. 41 42 clientError, ok := err.(ClientError) // Check if it is a ClientError. 43 if !ok { 44 // If the error is not ClientError, assume that it is ServerError. 45 w.WriteHeader(500) // return 500 Internal Server Error. 46 return 47 } 48 49 body, err := clientError.ResponseBody() // Try to get response body of ClientError. 50 if err != nil { 51 log.Printf("An error accured: %v", err) 52 w.WriteHeader(500) 53 return 54 } 55 status, headers := clientError.ResponseHeaders() // Get http status code and headers. 56 for k, v := range headers { 57 w.Header().Set(k, v) 58 } 59 w.WriteHeader(status) 60 w.Write(body) 61} 62 63func main() { 64 // Notice rootHandler. 65 http.Handle("/login/", rootHandler(loginHandler)) 66 log.Fatal(http.ListenAndServe(":8080", nil)) 67}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。