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) }
// SetPost is the API method for creating a new post. func SetPost(ctx *fasthttp.RequestCtx, _ fasthttprouter.Params) { v := &struct { Title string Body string }{} err := json.Unmarshal(ctx.PostBody(), v) if err != nil { ctx.Error(err.Error(), fasthttp.StatusInternalServerError) return } p := model.NewPost(v.Title, v.Body) id, err := p.Set(s) if err != nil { ctx.Error(err.Error(), fasthttp.StatusInternalServerError) return } ctx.Response.Header.Set("Content-Type", "application/json") resp, err := json.MarshalIndent(map[string]string{ "id": string(id), }, "", " ") if err != nil { ctx.Error(err.Error(), fasthttp.StatusInternalServerError) } ctx.Write(resp) }
func (l *logAction) Act(ruleName string, ctx *fasthttp.RequestCtx) error { _, err := fmt.Fprintf( l.destination, "[%v] %v %s %s %s%s \"%s\" \"%s\"\n", ruleName, time.Now().Format("2006-01-02 15:04:05.000"), ctx.Request.Header.Peek("X-Forwarded-For"), ctx.Method(), ctx.Host(), ctx.RequestURI(), ctx.PostBody(), ctx.Request.Header.UserAgent(), ) return err }
// /topics/:topic/:ver?key=mykey&async=1&delay=100 func (this *Gateway) pubHandler(ctx *fasthttp.RequestCtx, params fasthttprouter.Params) { t1 := time.Now() topic := params.ByName(UrlParamTopic) header := ctx.Request.Header appid := string(header.Peek(HttpHeaderAppid)) pubkey := string(header.Peek(HttpHeaderPubkey)) if err := manager.Default.OwnTopic(appid, pubkey, topic); err != nil { log.Error("app[%s] %s %+v: %v", appid, ctx.RemoteAddr(), params, err) ctx.SetConnectionClose() ctx.Error("invalid secret", fasthttp.StatusUnauthorized) return } msgLen := ctx.Request.Header.ContentLength() switch { case msgLen == -1: log.Warn("pub[%s] %s %+v invalid content length", appid, ctx.RemoteAddr(), params) ctx.Error("invalid content length", fasthttp.StatusBadRequest) return case int64(msgLen) > options.MaxPubSize: log.Warn("pub[%s] %s %+v too big content length:%d", appid, ctx.RemoteAddr(), params, msgLen) ctx.Error(ErrTooBigPubMessage.Error(), fasthttp.StatusBadRequest) return case msgLen < options.MinPubSize: log.Warn("pub[%s] %s %+v too small content length:%d", appid, ctx.RemoteAddr(), params, msgLen) ctx.Error(ErrTooSmallPubMessage.Error(), fasthttp.StatusBadRequest) return } ver := params.ByName(UrlParamVersion) queryArgs := ctx.Request.URI().QueryArgs() key := queryArgs.Peek("key") asyncArg := queryArgs.Peek("async") async := len(asyncArg) == 1 && asyncArg[0] == '1' //delay := hack.String(queryArgs.Peek("delay")) if options.Debug { log.Debug("pub[%s] %s {topic:%s, ver:%s, key:%s, async:%+v} %s", appid, ctx.RemoteAddr(), topic, ver, key, async, string(ctx.Request.Body())) } if !options.DisableMetrics { this.pubMetrics.PubQps.Mark(1) this.pubMetrics.PubMsgSize.Update(int64(len(ctx.PostBody()))) } pubMethod := store.DefaultPubStore.SyncPub if async { pubMethod = store.DefaultPubStore.AsyncPub } cluster, found := manager.Default.LookupCluster(appid) if !found { log.Error("cluster not found for app: %s", appid) ctx.Error("invalid appid", fasthttp.StatusBadRequest) return } err := pubMethod(cluster, manager.Default.KafkaTopic(appid, topic, ver), key, ctx.PostBody()) if err != nil { if !options.DisableMetrics { this.pubMetrics.PubFail(appid, topic, ver) } log.Error("%s: %v", ctx.RemoteAddr(), err) ctx.Error(err.Error(), fasthttp.StatusInternalServerError) return } // write the reponse ctx.Write(ResponseOk) if !options.DisableMetrics { this.pubMetrics.PubOk(appid, topic, ver) this.pubMetrics.PubLatency.Update(time.Since(t1).Nanoseconds() / 1e6) // in ms } }