// ServeHTTP is called whenever there is a new request. // This is quite similar to JavaEE Servlet interface. func (h *MyHandler) ServeHTTP(ctx *fasthttp.RequestCtx) { // In the future we can use requester can detect request spammers! // requester := ctx.RemoteAddr() // Increase request count count := &(h.requests) atomic.AddUint64(count, 1) if ctx.IsGet() { url := ctx.URI() operations, format, err, invalid := ParseURI(url, h.imageSource, h.watermarker) if err != nil { ctx.NotFound() logging.Debug(err) return } if invalid != nil { ctx.Error(invalid.Error(), 400) return } blob, err := h.operator.GetBlob(operations...) if err != nil { ctx.NotFound() logging.Debug(err) } else { ctx.SetContentType("image/" + format) ctx.Write(blob) logging.Debug("Blob returned") } } else if ctx.IsPost() { // POST is currently unused so we can use this for testing h.RetrieveHello(ctx) logging.Debug("Post request received") } }
func (p *Proxy) Handler(ctx *fasthttp.RequestCtx) { respState := rule.Evaluate(p.Rules, ctx) if respState == types.SERVED { return } appRequest := fasthttp.AcquireRequest() defer fasthttp.ReleaseRequest(appRequest) appRequest.Header.SetMethodBytes(ctx.Method()) ctx.Request.Header.CopyTo(&appRequest.Header) if ctx.IsPost() || ctx.IsPut() { appRequest.SetBody(ctx.PostBody()) } resp := fasthttp.AcquireResponse() defer fasthttp.ReleaseResponse(resp) err := p.client.Do(appRequest, resp) if err != nil { log.Println("Response error:", err, resp) ctx.SetStatusCode(429) return } resp.Header.CopyTo(&ctx.Response.Header) ctx.SetStatusCode(resp.StatusCode()) resp.BodyWriteTo(ctx) }
// HandleTokenRequest 处理令牌请求 func (fs *FastServer) HandleTokenRequest(ctx *fasthttp.RequestCtx) (err error) { if !ctx.IsPost() { err = ErrRequestMethodInvalid return } gt := oauth2.GrantType(string(ctx.FormValue("grant_type"))) if gt == "" || !fs.checkGrantType(gt) { err = ErrGrantTypeInvalid return } var ti oauth2.TokenInfo clientID, clientSecret, err := fs.cfg.Handler.ClientFastHandler(ctx) if err != nil { return } tgr := &oauth2.TokenGenerateRequest{ ClientID: clientID, ClientSecret: clientSecret, } switch gt { case oauth2.AuthorizationCodeCredentials: tgr.RedirectURI = string(ctx.FormValue("redirect_uri")) tgr.Code = string(ctx.FormValue("code")) tgr.IsGenerateRefresh = true ti, err = fs.manager.GenerateAccessToken(oauth2.AuthorizationCodeCredentials, tgr) case oauth2.PasswordCredentials: userID, uerr := fs.cfg.Handler.UserHandler(string(ctx.FormValue("username")), string(ctx.FormValue("password"))) if uerr != nil { err = uerr return } tgr.UserID = userID tgr.Scope = string(ctx.FormValue("scope")) tgr.IsGenerateRefresh = true ti, err = fs.manager.GenerateAccessToken(oauth2.PasswordCredentials, tgr) case oauth2.ClientCredentials: tgr.Scope = string(ctx.FormValue("scope")) ti, err = fs.manager.GenerateAccessToken(oauth2.ClientCredentials, tgr) case oauth2.RefreshCredentials: tgr.Refresh = string(ctx.FormValue("refresh_token")) tgr.Scope = string(ctx.FormValue("scope")) if tgr.Scope != "" { // 检查授权范围 rti, rerr := fs.manager.LoadRefreshToken(tgr.Refresh) if rerr != nil { err = rerr return } else if rti.GetClientID() != tgr.ClientID { err = ErrRefreshInvalid return } else if verr := fs.cfg.Handler.ScopeHandler(tgr.Scope, rti.GetScope()); verr != nil { err = verr return } } ti, err = fs.manager.RefreshAccessToken(tgr) if err == nil { ti.SetRefresh("") } } if err != nil { return } err = fs.ResJSON(ctx, ti) return }