github.com/gogf/gf@v1.16.9/net/ghttp/ghttp_unit_middleware_basic_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/gogf/gf.
     6  
     7  package ghttp_test
     8  
     9  import (
    10  	"fmt"
    11  	"github.com/gogf/gf/container/garray"
    12  	"github.com/gogf/gf/debug/gdebug"
    13  	"net/http"
    14  	"testing"
    15  	"time"
    16  
    17  	"github.com/gogf/gf/frame/g"
    18  	"github.com/gogf/gf/net/ghttp"
    19  	"github.com/gogf/gf/test/gtest"
    20  )
    21  
    22  func Test_BindMiddleware_Basic1(t *testing.T) {
    23  	p, _ := ports.PopRand()
    24  	s := g.Server(p)
    25  	s.BindHandler("/test/test", func(r *ghttp.Request) {
    26  		r.Response.Write("test")
    27  	})
    28  	s.BindMiddleware("/test", func(r *ghttp.Request) {
    29  		r.Response.Write("1")
    30  		r.Middleware.Next()
    31  		r.Response.Write("2")
    32  	}, func(r *ghttp.Request) {
    33  		r.Response.Write("3")
    34  		r.Middleware.Next()
    35  		r.Response.Write("4")
    36  	})
    37  	s.BindMiddleware("/test/:name", func(r *ghttp.Request) {
    38  		r.Response.Write("5")
    39  		r.Middleware.Next()
    40  		r.Response.Write("6")
    41  	}, func(r *ghttp.Request) {
    42  		r.Response.Write("7")
    43  		r.Middleware.Next()
    44  		r.Response.Write("8")
    45  	})
    46  	s.SetPort(p)
    47  	s.SetDumpRouterMap(false)
    48  	s.Start()
    49  	defer s.Shutdown()
    50  
    51  	time.Sleep(100 * time.Millisecond)
    52  	gtest.C(t, func(t *gtest.T) {
    53  		client := g.Client()
    54  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
    55  
    56  		t.Assert(client.GetContent("/"), "Not Found")
    57  		t.Assert(client.GetContent("/test"), "1342")
    58  		t.Assert(client.GetContent("/test/test"), "57test86")
    59  	})
    60  }
    61  
    62  func Test_BindMiddleware_Basic2(t *testing.T) {
    63  	p, _ := ports.PopRand()
    64  	s := g.Server(p)
    65  	s.BindHandler("/test/test", func(r *ghttp.Request) {
    66  		r.Response.Write("test")
    67  	})
    68  	s.BindMiddleware("/*", func(r *ghttp.Request) {
    69  		r.Response.Write("1")
    70  		r.Middleware.Next()
    71  		r.Response.Write("2")
    72  	})
    73  	s.SetPort(p)
    74  	s.SetDumpRouterMap(false)
    75  	s.Start()
    76  	defer s.Shutdown()
    77  
    78  	time.Sleep(100 * time.Millisecond)
    79  	gtest.C(t, func(t *gtest.T) {
    80  		client := g.Client()
    81  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
    82  
    83  		t.Assert(client.GetContent("/"), "12")
    84  		t.Assert(client.GetContent("/test"), "12")
    85  		t.Assert(client.GetContent("/test/test"), "1test2")
    86  	})
    87  }
    88  
    89  func Test_BindMiddleware_Basic3(t *testing.T) {
    90  	p, _ := ports.PopRand()
    91  	s := g.Server(p)
    92  	s.BindHandler("/test/test", func(r *ghttp.Request) {
    93  		r.Response.Write("test")
    94  	})
    95  	s.BindMiddleware("PUT:/test", func(r *ghttp.Request) {
    96  		r.Response.Write("1")
    97  		r.Middleware.Next()
    98  		r.Response.Write("2")
    99  	}, func(r *ghttp.Request) {
   100  		r.Response.Write("3")
   101  		r.Middleware.Next()
   102  		r.Response.Write("4")
   103  	})
   104  	s.BindMiddleware("POST:/test/:name", func(r *ghttp.Request) {
   105  		r.Response.Write("5")
   106  		r.Middleware.Next()
   107  		r.Response.Write("6")
   108  	}, func(r *ghttp.Request) {
   109  		r.Response.Write("7")
   110  		r.Middleware.Next()
   111  		r.Response.Write("8")
   112  	})
   113  	s.SetPort(p)
   114  	s.SetDumpRouterMap(false)
   115  	s.Start()
   116  	defer s.Shutdown()
   117  
   118  	time.Sleep(100 * time.Millisecond)
   119  	gtest.C(t, func(t *gtest.T) {
   120  		client := g.Client()
   121  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   122  
   123  		t.Assert(client.GetContent("/"), "Not Found")
   124  		t.Assert(client.GetContent("/test"), "Not Found")
   125  		t.Assert(client.PutContent("/test"), "1342")
   126  		t.Assert(client.PostContent("/test"), "Not Found")
   127  		t.Assert(client.GetContent("/test/test"), "test")
   128  		t.Assert(client.PutContent("/test/test"), "test")
   129  		t.Assert(client.PostContent("/test/test"), "57test86")
   130  	})
   131  }
   132  
   133  func Test_BindMiddleware_Basic4(t *testing.T) {
   134  	p, _ := ports.PopRand()
   135  	s := g.Server(p)
   136  	s.Group("/", func(group *ghttp.RouterGroup) {
   137  		group.Middleware(func(r *ghttp.Request) {
   138  			r.Response.Write("1")
   139  			r.Middleware.Next()
   140  		})
   141  		group.Middleware(func(r *ghttp.Request) {
   142  			r.Middleware.Next()
   143  			r.Response.Write("2")
   144  		})
   145  		group.ALL("/test", func(r *ghttp.Request) {
   146  			r.Response.Write("test")
   147  		})
   148  	})
   149  	s.SetPort(p)
   150  	s.SetDumpRouterMap(false)
   151  	s.Start()
   152  	defer s.Shutdown()
   153  
   154  	time.Sleep(100 * time.Millisecond)
   155  	gtest.C(t, func(t *gtest.T) {
   156  		client := g.Client()
   157  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   158  
   159  		t.Assert(client.GetContent("/"), "Not Found")
   160  		t.Assert(client.GetContent("/test"), "1test2")
   161  		t.Assert(client.PutContent("/test/none"), "Not Found")
   162  	})
   163  }
   164  
   165  func Test_Middleware_With_Static(t *testing.T) {
   166  	p, _ := ports.PopRand()
   167  	s := g.Server(p)
   168  	s.Group("/", func(group *ghttp.RouterGroup) {
   169  		group.Middleware(func(r *ghttp.Request) {
   170  			r.Response.Write("1")
   171  			r.Middleware.Next()
   172  			r.Response.Write("2")
   173  		})
   174  		group.ALL("/user/list", func(r *ghttp.Request) {
   175  			r.Response.Write("list")
   176  		})
   177  	})
   178  	s.SetPort(p)
   179  	s.SetDumpRouterMap(false)
   180  	s.SetServerRoot(gdebug.TestDataPath("static1"))
   181  	s.Start()
   182  	defer s.Shutdown()
   183  	time.Sleep(100 * time.Millisecond)
   184  	gtest.C(t, func(t *gtest.T) {
   185  		client := g.Client()
   186  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   187  
   188  		t.Assert(client.GetContent("/"), "index")
   189  		t.Assert(client.GetContent("/test.html"), "test")
   190  		t.Assert(client.GetContent("/none"), "Not Found")
   191  		t.Assert(client.GetContent("/user/list"), "1list2")
   192  	})
   193  }
   194  
   195  func Test_Middleware_Status(t *testing.T) {
   196  	p, _ := ports.PopRand()
   197  	s := g.Server(p)
   198  	s.Group("/", func(group *ghttp.RouterGroup) {
   199  		group.Middleware(func(r *ghttp.Request) {
   200  			r.Middleware.Next()
   201  			r.Response.WriteOver(r.Response.Status)
   202  		})
   203  		group.ALL("/user/list", func(r *ghttp.Request) {
   204  			r.Response.Write("list")
   205  		})
   206  	})
   207  	s.SetPort(p)
   208  	s.SetDumpRouterMap(false)
   209  	s.Start()
   210  	defer s.Shutdown()
   211  	time.Sleep(100 * time.Millisecond)
   212  	gtest.C(t, func(t *gtest.T) {
   213  		client := g.Client()
   214  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   215  
   216  		t.Assert(client.GetContent("/"), "Not Found")
   217  		t.Assert(client.GetContent("/user/list"), "200")
   218  
   219  		resp, err := client.Get("/")
   220  		defer resp.Close()
   221  		t.Assert(err, nil)
   222  		t.Assert(resp.StatusCode, 404)
   223  	})
   224  }
   225  
   226  func Test_Middleware_Hook_With_Static(t *testing.T) {
   227  	p, _ := ports.PopRand()
   228  	s := g.Server(p)
   229  	a := garray.New(true)
   230  	s.Group("/", func(group *ghttp.RouterGroup) {
   231  		group.Hook("/*", ghttp.HookBeforeServe, func(r *ghttp.Request) {
   232  			a.Append(1)
   233  			fmt.Println("HookBeforeServe")
   234  			r.Response.Write("a")
   235  		})
   236  		group.Hook("/*", ghttp.HookAfterServe, func(r *ghttp.Request) {
   237  			a.Append(1)
   238  			fmt.Println("HookAfterServe")
   239  			r.Response.Write("b")
   240  		})
   241  		group.Middleware(func(r *ghttp.Request) {
   242  			r.Response.Write("1")
   243  			r.Middleware.Next()
   244  			r.Response.Write("2")
   245  		})
   246  		group.ALL("/user/list", func(r *ghttp.Request) {
   247  			r.Response.Write("list")
   248  		})
   249  	})
   250  	s.SetPort(p)
   251  	s.SetDumpRouterMap(false)
   252  	s.SetServerRoot(gdebug.TestDataPath("static1"))
   253  	s.Start()
   254  	defer s.Shutdown()
   255  	time.Sleep(100 * time.Millisecond)
   256  	gtest.C(t, func(t *gtest.T) {
   257  		client := g.Client()
   258  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   259  
   260  		// The length assert sometimes fails, so I added time.Sleep here for debug purpose.
   261  
   262  		t.Assert(client.GetContent("/"), "index")
   263  		time.Sleep(100 * time.Millisecond)
   264  		t.Assert(a.Len(), 2)
   265  
   266  		t.Assert(client.GetContent("/test.html"), "test")
   267  		time.Sleep(100 * time.Millisecond)
   268  		t.Assert(a.Len(), 4)
   269  
   270  		t.Assert(client.GetContent("/none"), "ab")
   271  		time.Sleep(100 * time.Millisecond)
   272  		t.Assert(a.Len(), 6)
   273  
   274  		t.Assert(client.GetContent("/user/list"), "a1list2b")
   275  		time.Sleep(100 * time.Millisecond)
   276  		t.Assert(a.Len(), 8)
   277  	})
   278  }
   279  
   280  func Test_BindMiddleware_Status(t *testing.T) {
   281  	p, _ := ports.PopRand()
   282  	s := g.Server(p)
   283  	s.BindHandler("/test/test", func(r *ghttp.Request) {
   284  		r.Response.Write("test")
   285  	})
   286  	s.BindMiddleware("/test/*any", func(r *ghttp.Request) {
   287  		r.Middleware.Next()
   288  	})
   289  	s.SetPort(p)
   290  	s.SetDumpRouterMap(false)
   291  	s.Start()
   292  	defer s.Shutdown()
   293  
   294  	time.Sleep(100 * time.Millisecond)
   295  	gtest.C(t, func(t *gtest.T) {
   296  		client := g.Client()
   297  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   298  
   299  		t.Assert(client.GetContent("/"), "Not Found")
   300  		t.Assert(client.GetContent("/test"), "Not Found")
   301  		t.Assert(client.GetContent("/test/test"), "test")
   302  		t.Assert(client.GetContent("/test/test/test"), "Not Found")
   303  	})
   304  }
   305  
   306  func Test_BindMiddlewareDefault_Basic1(t *testing.T) {
   307  	p, _ := ports.PopRand()
   308  	s := g.Server(p)
   309  	s.BindHandler("/test/test", func(r *ghttp.Request) {
   310  		r.Response.Write("test")
   311  	})
   312  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   313  		r.Response.Write("1")
   314  		r.Middleware.Next()
   315  		r.Response.Write("2")
   316  	})
   317  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   318  		r.Response.Write("3")
   319  		r.Middleware.Next()
   320  		r.Response.Write("4")
   321  	})
   322  	s.SetPort(p)
   323  	s.SetDumpRouterMap(false)
   324  	s.Start()
   325  	defer s.Shutdown()
   326  
   327  	time.Sleep(100 * time.Millisecond)
   328  	gtest.C(t, func(t *gtest.T) {
   329  		client := g.Client()
   330  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   331  
   332  		t.Assert(client.GetContent("/"), "1342")
   333  		t.Assert(client.GetContent("/test/test"), "13test42")
   334  	})
   335  }
   336  
   337  func Test_BindMiddlewareDefault_Basic2(t *testing.T) {
   338  	p, _ := ports.PopRand()
   339  	s := g.Server(p)
   340  	s.BindHandler("PUT:/test/test", func(r *ghttp.Request) {
   341  		r.Response.Write("test")
   342  	})
   343  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   344  		r.Response.Write("1")
   345  		r.Middleware.Next()
   346  		r.Response.Write("2")
   347  	})
   348  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   349  		r.Response.Write("3")
   350  		r.Middleware.Next()
   351  		r.Response.Write("4")
   352  	})
   353  	s.SetPort(p)
   354  	s.SetDumpRouterMap(false)
   355  	s.Start()
   356  	defer s.Shutdown()
   357  
   358  	time.Sleep(100 * time.Millisecond)
   359  	gtest.C(t, func(t *gtest.T) {
   360  		client := g.Client()
   361  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   362  
   363  		t.Assert(client.GetContent("/"), "1342")
   364  		t.Assert(client.PutContent("/"), "1342")
   365  		t.Assert(client.GetContent("/test/test"), "1342")
   366  		t.Assert(client.PutContent("/test/test"), "13test42")
   367  	})
   368  }
   369  
   370  func Test_BindMiddlewareDefault_Basic3(t *testing.T) {
   371  	p, _ := ports.PopRand()
   372  	s := g.Server(p)
   373  	s.BindHandler("/test/test", func(r *ghttp.Request) {
   374  		r.Response.Write("test")
   375  	})
   376  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   377  		r.Response.Write("1")
   378  		r.Middleware.Next()
   379  	})
   380  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   381  		r.Middleware.Next()
   382  		r.Response.Write("2")
   383  	})
   384  	s.SetPort(p)
   385  	s.SetDumpRouterMap(false)
   386  	s.Start()
   387  	defer s.Shutdown()
   388  
   389  	time.Sleep(100 * time.Millisecond)
   390  	gtest.C(t, func(t *gtest.T) {
   391  		client := g.Client()
   392  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   393  
   394  		t.Assert(client.GetContent("/"), "12")
   395  		t.Assert(client.GetContent("/test/test"), "1test2")
   396  	})
   397  }
   398  
   399  func Test_BindMiddlewareDefault_Basic4(t *testing.T) {
   400  	p, _ := ports.PopRand()
   401  	s := g.Server(p)
   402  	s.BindHandler("/test/test", func(r *ghttp.Request) {
   403  		r.Response.Write("test")
   404  	})
   405  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   406  		r.Middleware.Next()
   407  		r.Response.Write("1")
   408  	})
   409  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   410  		r.Response.Write("2")
   411  		r.Middleware.Next()
   412  	})
   413  	s.SetPort(p)
   414  	s.SetDumpRouterMap(false)
   415  	s.Start()
   416  	defer s.Shutdown()
   417  
   418  	time.Sleep(100 * time.Millisecond)
   419  	gtest.C(t, func(t *gtest.T) {
   420  		client := g.Client()
   421  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   422  
   423  		t.Assert(client.GetContent("/"), "21")
   424  		t.Assert(client.GetContent("/test/test"), "2test1")
   425  	})
   426  }
   427  
   428  func Test_BindMiddlewareDefault_Basic5(t *testing.T) {
   429  	p, _ := ports.PopRand()
   430  	s := g.Server(p)
   431  	s.BindHandler("/test/test", func(r *ghttp.Request) {
   432  		r.Response.Write("test")
   433  	})
   434  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   435  		r.Response.Write("1")
   436  		r.Middleware.Next()
   437  	})
   438  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   439  		r.Response.Write("2")
   440  		r.Middleware.Next()
   441  	})
   442  	s.SetPort(p)
   443  	s.SetDumpRouterMap(false)
   444  	s.Start()
   445  	defer s.Shutdown()
   446  
   447  	time.Sleep(100 * time.Millisecond)
   448  	gtest.C(t, func(t *gtest.T) {
   449  		client := g.Client()
   450  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   451  
   452  		t.Assert(client.GetContent("/"), "12")
   453  		t.Assert(client.GetContent("/test/test"), "12test")
   454  	})
   455  }
   456  
   457  func Test_BindMiddlewareDefault_Status(t *testing.T) {
   458  	p, _ := ports.PopRand()
   459  	s := g.Server(p)
   460  	s.BindHandler("/test/test", func(r *ghttp.Request) {
   461  		r.Response.Write("test")
   462  	})
   463  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   464  		r.Middleware.Next()
   465  	})
   466  	s.SetPort(p)
   467  	s.SetDumpRouterMap(false)
   468  	s.Start()
   469  	defer s.Shutdown()
   470  
   471  	time.Sleep(100 * time.Millisecond)
   472  	gtest.C(t, func(t *gtest.T) {
   473  		client := g.Client()
   474  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   475  
   476  		t.Assert(client.GetContent("/"), "Not Found")
   477  		t.Assert(client.GetContent("/test/test"), "test")
   478  	})
   479  }
   480  
   481  type ObjectMiddleware struct{}
   482  
   483  func (o *ObjectMiddleware) Init(r *ghttp.Request) {
   484  	r.Response.Write("100")
   485  }
   486  
   487  func (o *ObjectMiddleware) Shut(r *ghttp.Request) {
   488  	r.Response.Write("200")
   489  }
   490  
   491  func (o *ObjectMiddleware) Index(r *ghttp.Request) {
   492  	r.Response.Write("Object Index")
   493  }
   494  
   495  func (o *ObjectMiddleware) Show(r *ghttp.Request) {
   496  	r.Response.Write("Object Show")
   497  }
   498  
   499  func (o *ObjectMiddleware) Info(r *ghttp.Request) {
   500  	r.Response.Write("Object Info")
   501  }
   502  
   503  func Test_BindMiddlewareDefault_Basic6(t *testing.T) {
   504  	p, _ := ports.PopRand()
   505  	s := g.Server(p)
   506  	s.BindObject("/", new(ObjectMiddleware))
   507  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   508  		r.Response.Write("1")
   509  		r.Middleware.Next()
   510  		r.Response.Write("2")
   511  	})
   512  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   513  		r.Response.Write("3")
   514  		r.Middleware.Next()
   515  		r.Response.Write("4")
   516  	})
   517  	s.SetPort(p)
   518  	s.SetDumpRouterMap(false)
   519  	s.Start()
   520  	defer s.Shutdown()
   521  
   522  	time.Sleep(100 * time.Millisecond)
   523  	gtest.C(t, func(t *gtest.T) {
   524  		client := g.Client()
   525  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   526  
   527  		t.Assert(client.GetContent("/"), "13100Object Index20042")
   528  		t.Assert(client.GetContent("/init"), "1342")
   529  		t.Assert(client.GetContent("/shut"), "1342")
   530  		t.Assert(client.GetContent("/index"), "13100Object Index20042")
   531  		t.Assert(client.GetContent("/show"), "13100Object Show20042")
   532  		t.Assert(client.GetContent("/none-exist"), "1342")
   533  	})
   534  }
   535  
   536  func Test_Hook_Middleware_Basic1(t *testing.T) {
   537  	p, _ := ports.PopRand()
   538  	s := g.Server(p)
   539  	s.BindHandler("/test/test", func(r *ghttp.Request) {
   540  		r.Response.Write("test")
   541  	})
   542  	s.BindHookHandler("/*", ghttp.HookBeforeServe, func(r *ghttp.Request) {
   543  		r.Response.Write("a")
   544  	})
   545  	s.BindHookHandler("/*", ghttp.HookAfterServe, func(r *ghttp.Request) {
   546  		r.Response.Write("b")
   547  	})
   548  	s.BindHookHandler("/*", ghttp.HookBeforeServe, func(r *ghttp.Request) {
   549  		r.Response.Write("c")
   550  	})
   551  	s.BindHookHandler("/*", ghttp.HookAfterServe, func(r *ghttp.Request) {
   552  		r.Response.Write("d")
   553  	})
   554  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   555  		r.Response.Write("1")
   556  		r.Middleware.Next()
   557  		r.Response.Write("2")
   558  	})
   559  	s.BindMiddlewareDefault(func(r *ghttp.Request) {
   560  		r.Response.Write("3")
   561  		r.Middleware.Next()
   562  		r.Response.Write("4")
   563  	})
   564  	s.SetPort(p)
   565  	s.SetDumpRouterMap(false)
   566  	s.Start()
   567  	defer s.Shutdown()
   568  
   569  	time.Sleep(100 * time.Millisecond)
   570  	gtest.C(t, func(t *gtest.T) {
   571  		client := g.Client()
   572  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   573  
   574  		t.Assert(client.GetContent("/"), "ac1342bd")
   575  		t.Assert(client.GetContent("/test/test"), "ac13test42bd")
   576  	})
   577  }
   578  
   579  func MiddlewareAuth(r *ghttp.Request) {
   580  	token := r.Get("token")
   581  	if token == "123456" {
   582  		r.Middleware.Next()
   583  	} else {
   584  		r.Response.WriteStatus(http.StatusForbidden)
   585  	}
   586  }
   587  
   588  func MiddlewareCORS(r *ghttp.Request) {
   589  	r.Response.CORSDefault()
   590  	r.Middleware.Next()
   591  }
   592  
   593  func Test_Middleware_CORSAndAuth(t *testing.T) {
   594  	p, _ := ports.PopRand()
   595  	s := g.Server(p)
   596  	s.Use(MiddlewareCORS)
   597  	s.Group("/api.v2", func(group *ghttp.RouterGroup) {
   598  		group.Middleware(MiddlewareAuth)
   599  		group.POST("/user/list", func(r *ghttp.Request) {
   600  			r.Response.Write("list")
   601  		})
   602  	})
   603  	s.SetPort(p)
   604  	s.SetDumpRouterMap(false)
   605  	s.Start()
   606  	defer s.Shutdown()
   607  	time.Sleep(100 * time.Millisecond)
   608  	gtest.C(t, func(t *gtest.T) {
   609  		client := g.Client()
   610  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   611  		// Common Checks.
   612  		t.Assert(client.GetContent("/"), "Not Found")
   613  		t.Assert(client.GetContent("/api.v2"), "Not Found")
   614  		// Auth Checks.
   615  		t.Assert(client.PostContent("/api.v2/user/list"), "Forbidden")
   616  		t.Assert(client.PostContent("/api.v2/user/list", "token=123456"), "list")
   617  		// CORS Checks.
   618  		resp, err := client.Post("/api.v2/user/list", "token=123456")
   619  		t.Assert(err, nil)
   620  		t.Assert(len(resp.Header["Access-Control-Allow-Headers"]), 1)
   621  		t.Assert(resp.Header["Access-Control-Allow-Headers"][0], "Origin,Content-Type,Accept,User-Agent,Cookie,Authorization,X-Auth-Token,X-Requested-With")
   622  		t.Assert(resp.Header["Access-Control-Allow-Methods"][0], "GET,PUT,POST,DELETE,PATCH,HEAD,CONNECT,OPTIONS,TRACE")
   623  		t.Assert(resp.Header["Access-Control-Allow-Origin"][0], "*")
   624  		t.Assert(resp.Header["Access-Control-Max-Age"][0], "3628800")
   625  		resp.Close()
   626  	})
   627  }
   628  
   629  func MiddlewareScope1(r *ghttp.Request) {
   630  	r.Response.Write("a")
   631  	r.Middleware.Next()
   632  	r.Response.Write("b")
   633  }
   634  
   635  func MiddlewareScope2(r *ghttp.Request) {
   636  	r.Response.Write("c")
   637  	r.Middleware.Next()
   638  	r.Response.Write("d")
   639  }
   640  
   641  func MiddlewareScope3(r *ghttp.Request) {
   642  	r.Response.Write("e")
   643  	r.Middleware.Next()
   644  	r.Response.Write("f")
   645  }
   646  
   647  func Test_Middleware_Scope(t *testing.T) {
   648  	p, _ := ports.PopRand()
   649  	s := g.Server(p)
   650  	s.Group("/", func(group *ghttp.RouterGroup) {
   651  		group.Middleware(MiddlewareScope1)
   652  		group.ALL("/scope1", func(r *ghttp.Request) {
   653  			r.Response.Write("1")
   654  		})
   655  		group.Group("/", func(group *ghttp.RouterGroup) {
   656  			group.Middleware(MiddlewareScope2)
   657  			group.ALL("/scope2", func(r *ghttp.Request) {
   658  				r.Response.Write("2")
   659  			})
   660  		})
   661  		group.Group("/", func(group *ghttp.RouterGroup) {
   662  			group.Middleware(MiddlewareScope3)
   663  			group.ALL("/scope3", func(r *ghttp.Request) {
   664  				r.Response.Write("3")
   665  			})
   666  		})
   667  	})
   668  	s.SetPort(p)
   669  	s.SetDumpRouterMap(false)
   670  	s.Start()
   671  	defer s.Shutdown()
   672  	time.Sleep(100 * time.Millisecond)
   673  	gtest.C(t, func(t *gtest.T) {
   674  		client := g.Client()
   675  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   676  
   677  		t.Assert(client.GetContent("/"), "Not Found")
   678  		t.Assert(client.GetContent("/scope1"), "a1b")
   679  		t.Assert(client.GetContent("/scope2"), "ac2db")
   680  		t.Assert(client.GetContent("/scope3"), "ae3fb")
   681  	})
   682  }
   683  
   684  func Test_Middleware_Panic(t *testing.T) {
   685  	p, _ := ports.PopRand()
   686  	s := g.Server(p)
   687  	i := 0
   688  	s.Group("/", func(group *ghttp.RouterGroup) {
   689  		group.Group("/", func(group *ghttp.RouterGroup) {
   690  			group.Middleware(func(r *ghttp.Request) {
   691  				i++
   692  				panic("error")
   693  				r.Middleware.Next()
   694  			}, func(r *ghttp.Request) {
   695  				i++
   696  				r.Middleware.Next()
   697  			})
   698  			group.ALL("/", func(r *ghttp.Request) {
   699  				r.Response.Write(i)
   700  			})
   701  		})
   702  	})
   703  	s.SetPort(p)
   704  	s.SetDumpRouterMap(false)
   705  	s.Start()
   706  	defer s.Shutdown()
   707  	time.Sleep(100 * time.Millisecond)
   708  	gtest.C(t, func(t *gtest.T) {
   709  		client := g.Client()
   710  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p))
   711  
   712  		t.Assert(client.GetContent("/"), "error")
   713  	})
   714  }