func (a *Language) DetectUA(r engine.Request) string { ua := r.UserAgent() ua = a.uaRegexp.ReplaceAllString(ua, ``) lg := strings.SplitN(ua, `,`, 5) for _, lang := range lg { lang = strings.ToLower(lang) if a.IsOk(lang) { return lang } } return a.Default }
// HTTP服务执行入口 func (s *Server) ServeHTTP(r engine.Request, w engine.Response) { var h *echo.Echo app, ok := s.Apps[r.Host()] if !ok || app.Handler == nil { h = s.Core } else { h = app.Handler } if h != nil { h.ServeHTTP(r, w) } else { w.NotFound() } }
func ParseFromRequest(req engine.Request, keyFunc jwt.Keyfunc) (token *jwt.Token, err error) { // Look for an Authorization header if ah := req.Header().Get("Authorization"); ah != "" { // Should be a bearer token if len(ah) > 6 && strings.ToUpper(ah[0:6]) == "BEARER" { return jwt.Parse(ah[7:], keyFunc) } } // Look for "access_token" parameter if tokStr := req.FormValue("access_token"); tokStr != "" { return jwt.Parse(tokStr, keyFunc) } return nil, jwt.ErrNoTokenInRequest }
func (a *Language) DetectURI(_ engine.Response, r engine.Request) string { p := strings.TrimPrefix(r.URL().Path(), `/`) s := strings.Index(p, `/`) var lang string if s != -1 { lang = p[0:s] } else { lang = p } if lang != "" { if on, ok := a.List[lang]; ok { r.URL().SetPath(strings.TrimPrefix(p, lang)) if !on { lang = "" } } else { lang = "" } } if lang == "" { lang = a.DetectUA(r) } return lang }
// RemoteIP finds IP Address given http.Request struct. func RemoteIP(ipLookups []string, r engine.Request) string { realIP := r.Header().Get("X-Real-IP") forwardedFor := r.Header().Get("X-Forwarded-For") for _, lookup := range ipLookups { if lookup == "RemoteAddr" { return ipAddrFromRemoteAddr(r.RemoteAddress()) } if lookup == "X-Forwarded-For" && forwardedFor != "" { // X-Forwarded-For is potentially a list of addresses separated with "," parts := strings.Split(forwardedFor, ",") for i, p := range parts { parts[i] = strings.TrimSpace(p) } return parts[0] } if lookup == "X-Real-IP" && realIP != "" { return realIP } } return "" }
// BuildKeys generates a slice of keys to rate-limit by given config and request structs. func BuildKeys(limiter *config.Limiter, r engine.Request) [][]string { remoteIP := RemoteIP(limiter.IPLookups, r) path := r.URL().Path() sliceKeys := make([][]string, 0) // Don't BuildKeys if remoteIP is blank. if remoteIP == "" { return sliceKeys } if limiter.Methods != nil && limiter.Headers != nil && limiter.BasicAuthUsers != nil { // Limit by HTTP methods and HTTP headers+values and Basic Auth credentials. if StringInSlice(limiter.Methods, r.Method()) { for headerKey, headerValues := range limiter.Headers { if (headerValues == nil || len(headerValues) <= 0) && r.Header().Get(headerKey) != "" { // If header values are empty, rate-limit all request with headerKey. username, _, ok := r.BasicAuth() if ok && libstring.StringInSlice(limiter.BasicAuthUsers, username) { sliceKeys = append(sliceKeys, []string{remoteIP, path, r.Method(), headerKey, username}) } } else if len(headerValues) > 0 && r.Header().Get(headerKey) != "" { // If header values are not empty, rate-limit all request with headerKey and headerValues. for _, headerValue := range headerValues { username, _, ok := r.BasicAuth() if ok && libstring.StringInSlice(limiter.BasicAuthUsers, username) { sliceKeys = append(sliceKeys, []string{remoteIP, path, r.Method(), headerKey, headerValue, username}) } } } } } } else if limiter.Methods != nil && limiter.Headers != nil { // Limit by HTTP methods and HTTP headers+values. if libstring.StringInSlice(limiter.Methods, r.Method()) { for headerKey, headerValues := range limiter.Headers { if (headerValues == nil || len(headerValues) <= 0) && r.Header().Get(headerKey) != "" { // If header values are empty, rate-limit all request with headerKey. sliceKeys = append(sliceKeys, []string{remoteIP, path, r.Method(), headerKey}) } else if len(headerValues) > 0 && r.Header().Get(headerKey) != "" { // If header values are not empty, rate-limit all request with headerKey and headerValues. for _, headerValue := range headerValues { sliceKeys = append(sliceKeys, []string{remoteIP, path, r.Method(), headerKey, headerValue}) } } } } } else if limiter.Methods != nil && limiter.BasicAuthUsers != nil { // Limit by HTTP methods and Basic Auth credentials. if libstring.StringInSlice(limiter.Methods, r.Method()) { username, _, ok := r.BasicAuth() if ok && libstring.StringInSlice(limiter.BasicAuthUsers, username) { sliceKeys = append(sliceKeys, []string{remoteIP, path, r.Method(), username}) } } } else if limiter.Methods != nil { // Limit by HTTP methods. if libstring.StringInSlice(limiter.Methods, r.Method()) { sliceKeys = append(sliceKeys, []string{remoteIP, path, r.Method()}) } } else if limiter.Headers != nil { // Limit by HTTP headers+values. for headerKey, headerValues := range limiter.Headers { if (headerValues == nil || len(headerValues) <= 0) && r.Header().Get(headerKey) != "" { // If header values are empty, rate-limit all request with headerKey. sliceKeys = append(sliceKeys, []string{remoteIP, path, headerKey}) } else if len(headerValues) > 0 && r.Header().Get(headerKey) != "" { // If header values are not empty, rate-limit all request with headerKey and headerValues. for _, headerValue := range headerValues { sliceKeys = append(sliceKeys, []string{remoteIP, path, headerKey, headerValue}) } } } } else if limiter.BasicAuthUsers != nil { // Limit by Basic Auth credentials. username, _, ok := r.BasicAuth() if ok && libstring.StringInSlice(limiter.BasicAuthUsers, username) { sliceKeys = append(sliceKeys, []string{remoteIP, path, username}) } } else { // Default: Limit by remoteIP and path. sliceKeys = append(sliceKeys, []string{remoteIP, path}) } return sliceKeys }