9
"mosn.io/mosn/test/lib"
10
"mosn.io/mosn/test/lib/types"
14
lib.RegisterCreateServer("Http1", NewHTTPServer)
17
type MockHttpServer struct {
20
mux map[string]func(http.ResponseWriter, *http.Request)
21
stats *types.ServerStats
25
listener *StatsListener
28
func NewHTTPServer(config interface{}) types.MockServer {
29
cfg, err := NewHttpServerConfig(config)
31
log.DefaultLogger.Errorf("new http server config error: %v", err)
34
if len(cfg.Configs) == 0 { // use default config
35
cfg.Configs = map[string]*ResonseConfig{
37
Condition: nil, // always matched true
38
CommonBuilder: &ResponseBuilder{
39
StatusCode: http.StatusOK,
40
Header: map[string][]string{
41
"mosn-test-default": []string{"http1"},
43
Body: string("default-http1"),
45
ErrorBuilder: &ResponseBuilder{
46
StatusCode: http.StatusInternalServerError, // 500
47
Body: string("condition is not matched"),
55
mux: make(map[string]func(http.ResponseWriter, *http.Request)),
56
stats: types.NewServerStats(),
57
server: &http.Server{},
59
for pattern, c := range cfg.Configs {
60
s.mux[pattern] = c.ServeHTTP
65
// Wrap a http server so we can get the metrics info
66
func (s *MockHttpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
68
s.stats.Records().RecordRequest()
69
ww := &ResponseWriterWrapper{
73
handler, ok := s.mux[r.URL.Path]
75
ww.WriteHeader(http.StatusNotFound)
81
func (s *MockHttpServer) Start() {
83
defer s.mutex.Unlock()
84
if s.listener != nil {
87
ln, err := net.Listen("tcp", s.addr)
89
log.DefaultLogger.Fatalf("listen %s failed", s.addr)
91
s.listener = NewStatsListener(ln, s.stats)
93
// register http server
94
mux := &http.ServeMux{}
95
mux.HandleFunc("/", s.ServeHTTP) // use mock server http
96
s.server.Handler = mux
97
go s.server.Serve(s.listener)
101
func (s *MockHttpServer) Stop() {
103
defer s.mutex.Unlock()
108
func (s *MockHttpServer) Stats() types.ServerStatsReadOnly {