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 (s *Selector) Match(ctx *fasthttp.RequestCtx) (string, bool) { var matchSlice []byte found := false switch s.RequestAttr { case "IP": matchSlice = []byte(ctx.RemoteIP().String()) case "Method": matchSlice = ctx.Method() case "Path": matchSlice = ctx.Path() case "Host": matchSlice = ctx.Host() case "POST": matchSlice = ctx.PostArgs().Peek(s.SubAttr) case "GET": matchSlice = ctx.QueryArgs().Peek(s.SubAttr) case "Param": matchSlice = ctx.PostArgs().Peek(s.SubAttr) if matchSlice == nil { matchSlice = ctx.QueryArgs().Peek(s.SubAttr) } case "Header": matchSlice = ctx.Request.Header.Peek(s.SubAttr) default: log.Println("unknown request attribute:", s.RequestAttr) } if matchSlice != nil && (s.Regexp == nil || s.Regexp.Match(matchSlice)) { found = true } if s.Negate { found = !found } return string(matchSlice), found }
// CheckHost Implement a CheckHost method on our new type func (hs HostSwitch) CheckHost(ctx *fasthttp.RequestCtx) { // Check if a http.Handler is registered for the given host. // If yes, use it to handle the request. if handler := hs[string(ctx.Host())]; handler != nil { handler(ctx) } else { // Handle host names for wich no handler is registered ctx.Error("Forbidden", 403) // Or Redirect? } }
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 }