2017-02-02 18 views
0

Я использую Gorilla мультиплексор как мой маршрутизатор и диспетчер в моем golang приложениях и у меня есть -I think- простого вопрос:Gorilla Мультиплексора HTTP пакет

В моем основном я создаю маршрутизатор: r := mux.NewRouter(). Еще несколько строк, я регистрирую обработчик: r.HandleFunc("/", doSomething).

Пока все хорошо, но теперь моя проблема в том, что у меня есть пакет, который добавляет обработчики к http package Golang, а не к моему мультиплексору. Как это:

func AddInternalHandlers() { 
    http.HandleFunc("/internal/selfdiagnose.html", handleSelfdiagnose) 
    http.HandleFunc("/internal/selfdiagnose.xml", handleSelfdiagnose) 
    http.HandleFunc("/internal/selfdiagnose.json", handleSelfdiagnose) 
} 

Как вы можете видеть, это добавляет ручки к http.HandleFunc и не на МПЛ-handleFunc. Любая идея, как я могу исправить это, не касаясь самого пакета?

Рабочий пример

package main 

import (
    "fmt" 
    "log" 

    "net/http" 

    selfdiagnose "github.com/emicklei/go-selfdiagnose" 
    "github.com/gorilla/mux" 
) 

func homeHandler(w http.ResponseWriter, r *http.Request) { 
    log.Println("home") 
} 

func main() { 
    r := mux.NewRouter() 
    r.HandleFunc("/", homeHandler) 

    selfdiagnose.AddInternalHandlers() 

    // when handler (nil) gets replaced with mux (r), then the 
    // handlers in package selfdiagnose are not "active" 
    err := http.ListenAndServe(fmt.Sprintf("%s:%d", "localhost", 8080), nil) 
    if err != nil { 
     log.Println(err) 
    } 

} 
+0

Вы спрашиваете, как вы могли бы извлечь обработчик из DefaultServeMux и вставить их в свой маршрутизатор? Вероятно, было бы более удобно обслуживать ваш пакет, чтобы не регистрировать обработчики, подобные этому. – JimB

+0

Проблема в том, что это не мой пакет :). –

+0

Итак, что вы спрашиваете? Или, может быть, вы хотите добавить свой маршрутизатор в DefaultServeMux? – JimB

ответ

1

Ну, в вашем конкретном случае, решение легко.

Автор пакета selfdiagnose решил сделать handlers себя публично, так что вы можете использовать их непосредственно:

r.HandleFunc("/", homeHandler) 
// use the handlers directly, but you need to name a route yourself 
r.HandleFunc("/debug", selfdiagnose.HandleSelfdiagnose) 

Рабочего пример: https://gist.github.com/miku/9836026cacc170ad5bf7530a75fec777

+0

Спасибо! Я использовал (старую) версию версии пакета, где HandleSelfdiagnose еще не был открыт :). См. Так: https://github.com/emicklei/go-selfdiagnose/commit/b9c2cfa244ed2f8a2e654b782ac8fb315265d8a4 –