func requestHandler(ctx *fasthttp.RequestCtx) { fmt.Fprintf(ctx, "Hello, world!\n\n") fmt.Fprintf(ctx, "Request method is %q\n", ctx.Method()) fmt.Fprintf(ctx, "RequestURI is %q\n", ctx.RequestURI()) fmt.Fprintf(ctx, "Requested path is %q\n", ctx.Path()) fmt.Fprintf(ctx, "Host is %q\n", ctx.Host()) fmt.Fprintf(ctx, "Query string is %q\n", ctx.QueryArgs()) fmt.Fprintf(ctx, "User-Agent is %q\n", ctx.UserAgent()) fmt.Fprintf(ctx, "Connection has been established at %s\n", ctx.ConnTime()) fmt.Fprintf(ctx, "Request has been started at %s\n", ctx.Time()) fmt.Fprintf(ctx, "Serial request number for the current connection is %d\n", ctx.ConnRequestNum()) fmt.Fprintf(ctx, "Your ip is %q\n\n", ctx.RemoteIP()) fmt.Fprintf(ctx, "Raw request is:\n---CUT---\n%s\n---CUT---", &ctx.Request) ctx.SetContentType("text/plain; charset=utf8") // Set arbitrary headers ctx.Response.Header.Set("X-My-Header", "my-header-value") // Set cookies var c fasthttp.Cookie c.SetKey("cookie-name") c.SetValue("cookie-value") ctx.Response.Header.SetCookie(&c) }
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 }
func requestHandler(ctx *fasthttp.RequestCtx) { h := &ctx.Request.Header if !ctx.IsGet() { ctx.Error("Method not allowed", fasthttp.StatusMethodNotAllowed) return } if string(ctx.RequestURI()) == *statsRequestPath { var w bytes.Buffer stats.WriteToStream(&w) ctx.Success("text/plain", w.Bytes()) return } if len(h.Peek("If-None-Match")) > 0 { resp := &ctx.Response resp.SetStatusCode(fasthttp.StatusNotModified) resp.Header.Set("Etag", "W/\"CacheForever\"") atomic.AddInt64(&stats.IfNoneMatchHitsCount, 1) return } v := keyPool.Get() if v == nil { v = make([]byte, 128) } key := v.([]byte) key = append(key[:0], getRequestHost(h)...) key = append(key, ctx.RequestURI()...) item, err := cache.GetDeItem(key, time.Second) if err != nil { if err != ybc.ErrCacheMiss { logFatal("Unexpected error when obtaining cache value by key=[%s]: [%s]", key, err) } atomic.AddInt64(&stats.CacheMissesCount, 1) item = fetchFromUpstream(h, key) if item == nil { ctx.Error("Service unavailable", fasthttp.StatusServiceUnavailable) return } } else { atomic.AddInt64(&stats.CacheHitsCount, 1) } defer item.Close() keyPool.Put(v) contentType, err := loadContentType(h, item) if err != nil { ctx.Error("Internal Server Error", fasthttp.StatusInternalServerError) return } rh := &ctx.Response.Header rh.Set("Etag", "W/\"CacheForever\"") rh.Set("Cache-Control", "public, max-age=31536000") buf := item.Value() buf = buf[len(buf)-item.Available():] ctx.Success(contentType, buf) atomic.AddInt64(&stats.BytesSentToClients, int64(len(buf))) }
// request handler in fasthttp style, i.e. just plain function. func fastHTTPHandler(ctx *fasthttp.RequestCtx) { fmt.Fprintf(ctx, "Hi there! RequestURI is %q", ctx.RequestURI()) }