2014-06-16 31 views
7

Tôi khá mới đối với Go và không thể tìm thấy bất kỳ thông tin nào về điều này, có thể nó không thể thực hiện tại thời điểm này.Golang http mux chức năng xử lý thay đổi

Tôi đang cố xóa hoặc thay thế tuyến đường mux (sử dụng http.NewServeMux hoặc mux.Router của gorilla). Mục tiêu cuối cùng của tôi là có thể bật/tắt tuyến đường hoặc tập hợp tuyến mà không phải khởi động lại chương trình.

Tôi có thể thực hiện điều này trên trình xử lý để xử lý cơ sở và chỉ trả lại 404 nếu tính năng đó bị vô hiệu hóa, nhưng tôi muốn tìm cách làm chung hơn vì tôi muốn triển khai nó cho mọi tuyến đường ứng dụng của tôi.

Hoặc tôi có nên dừng việc theo dõi các mẫu url bị vô hiệu hóa và sử dụng một số phần mềm trung gian để ngăn chặn việc xử lý không?

Nếu ai đó ít nhất có thể chỉ cho tôi đúng hướng, tôi sẽ hoàn toàn đăng các ví dụ mã của giải pháp giả sử có một giải pháp. Cảm ơn!

Trả lời

7

Không có cách nào được tích hợp sẵn, nhưng thật dễ dàng để triển khai play.

type HasHandleFunc interface { //this is just so it would work for gorilla and http.ServerMux 
    HandleFunc(pattern string, handler func(w http.ResponseWriter, req *http.Request)) 
} 
type Handler struct { 
    http.HandlerFunc 
    Enabled bool 
} 
type Handlers map[string]*Handler 

func (h Handlers) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    path := r.URL.Path 
    if handler, ok := h[path]; ok && handler.Enabled { 
     handler.ServeHTTP(w, r) 
    } else { 
     http.Error(w, "Not Found", http.StatusNotFound) 
    } 
} 

func (h Handlers) HandleFunc(mux HasHandleFunc, pattern string, handler http.HandlerFunc) { 
    h[pattern] = &Handler{handler, true} 
    mux.HandleFunc(pattern, h.ServeHTTP) 
} 

func main() { 
    mux := http.NewServeMux() 
    handlers := Handlers{} 
    handlers.HandleFunc(mux, "/", func(w http.ResponseWriter, r *http.Request) { 
     w.Write([]byte("this will show once")) 
     handlers["/"].Enabled = false 
    }) 
    http.Handle("/", mux) 
    http.ListenAndServe(":9020", nil) 
} 
0

Có thể.

Một cách để thực hiện điều đó là có sturct thực hiện giao diện http.Handle với phương thức ServeHTTP. Sau đó có struct chứa khác muxer như khỉ đột của và cuối cùng là có một Chuyển nguyên tử để bật/tắt subrouting

Đây là một ví dụ làm việc của những gì tôi có nghĩa là:

package main 

import (
    "fmt" 
    "github.com/gorilla/mux" 
    "net/http" 
    "sync/atomic" 
) 

var recording int32 

func isRecording() bool { 
    return atomic.LoadInt32(&recording) != 0 
} 

func setRecording(shouldRecord bool) { 
    if shouldRecord { 
     atomic.StoreInt32(&recording, 1) 
    } else { 
     atomic.StoreInt32(&recording, 0) 
    } 
} 

type SwitchHandler struct { 
    mux http.Handler 
} 

func (s *SwitchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    if isRecording() { 
     fmt.Printf("Switch Handler is Recording\n") 
     s.mux.ServeHTTP(w, r) 
     return 
    } 

    fmt.Printf("Switch Handler is NOT Recording\n") 
    w.WriteHeader(http.StatusNotFound) 
    fmt.Fprintf(w, "NOT Recording\n") 

} 

func main() { 
    router := mux.NewRouter() 
    router.HandleFunc("/success/", func(w http.ResponseWriter, r *http.Request) { 
     fmt.Fprintf(w, "Recording\n") 
    }) 

    handler := &SwitchHandler{mux: router} 

    setRecording(false) 

    http.Handle("/", handler) 

    http.ListenAndServe(":8080", nil) 
} 
Các vấn đề liên quan