2014-11-19 5 views
1

Я бегу сервер с ниже код:Golang Negroni и http.NewServeMux() вопрос

// Assuming there is no import error 
    mux := http.NewServeMux() 
    mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { 
    http.Error(w, "File not found", http.StatusNotFound) 
    }) 

    n := negroni.Classic() 
    n.Use(negroni.HandlerFunc(bodmas.sum(4,5))) 
    n.UseHandler(mux) 
    n.Run(":4000") 

Он отлично работает.

Но когда я обертываю bodmas.sum с другим http handler Я всегда получаю «Файл не найден». Поток не идет по этому маршруту.

mux := http.NewServeMux() 
    mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { 
    http.Error(w, "File not found", http.StatusNotFound) 
    }) 

    n := negroni.Classic() 
    n.Use(negroni.HandlerFunc(wrapper.RateLimit(bodmas.sum(4,5),10))) 
    n.UseHandler(mux) 
    n.Run(":" + cfg.Server.Port) 
} 

wrapper.RateLimit определяется ниже. Это работает как ожидалось при тестировании отдельно:

func RateLimit(h resized.HandlerFunc, rate int) (resized.HandlerFunc) { 
    : 
    : 
    // logic here 

    rl, _ := ratelimit.NewRateLimiter(rate) 

    return func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc){ 
     if rl.Limit(){ 
      http.Error(w, "Gateway Timeout", http.StatusGatewayTimeout) 
     } else { 
      next(w, r) 
     } 
    } 
} 

Ошибка не допускается. Любые предложения по этому поведению? Как заставить его работать?

ответ

2

Я не уверен, в чем проблема с этим кодом, но, похоже, это не путь negorni. negroni может не работать должным образом, если мы завершим его обработчик другим http.Handlerfunc. Итак, я изменил свой код и получил работу от middleware.

Моего текущий код выглядит примерно так, как показано ниже:

  mux := http.NewServeMux() 
      mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { 
      http.Error(w, "File not found", http.StatusNotFound) 
      }) 

      n := negroni.Classic() 
      n.Use(wrapper.Ratelimit(10)) 
      n.Use(negroni.HandlerFunc(bodmas.sum(4,5))) 
      n.UseHandler(mux) 
      n.Run(":4000") 
    } 

wrapper.go имеет:

type RatelimitStruct struct { 
      rate int 
    } 

    // A struct that has a ServeHTTP method 
    func Ratelimit(rate int) *RatelimitStruct{ 
     return &RatelimitStruct{rate} 
    } 

    func (r *RatelimitStruct) ServeHTTP(w http.ResponseWriter, req *http.Request, next  http.HandlerFunc){ 
     rl, _ := ratelimit.NewRateLimiter(r.rate) 

     if rl.Limit(){ 
      http.Error(w, "Gateway Timeout", http.StatusGatewayTimeout) 
     } 

else { 
     next(w, req) 
    } 
} 

Надеется, что это поможет кому-то.

 Смежные вопросы

  • Нет связанных вопросов^_^