github.com/wangyougui/gf/v2@v2.6.5/net/ghttp/ghttp_z_unit_feature_static_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/wangyougui/gf.
     6  
     7  // static service testing.
     8  
     9  package ghttp_test
    10  
    11  import (
    12  	"fmt"
    13  	"testing"
    14  	"time"
    15  
    16  	"github.com/wangyougui/gf/v2/frame/g"
    17  	"github.com/wangyougui/gf/v2/os/gfile"
    18  	"github.com/wangyougui/gf/v2/test/gtest"
    19  	"github.com/wangyougui/gf/v2/text/gstr"
    20  	"github.com/wangyougui/gf/v2/util/guid"
    21  )
    22  
    23  func Test_Static_ServerRoot(t *testing.T) {
    24  	// SetServerRoot with absolute path
    25  	gtest.C(t, func(t *gtest.T) {
    26  		s := g.Server(guid.S())
    27  		path := fmt.Sprintf(`%s/ghttp/static/test/%d`, gfile.Temp(), s.GetListenedPort())
    28  		defer gfile.Remove(path)
    29  		gfile.PutContents(path+"/index.htm", "index")
    30  		s.SetServerRoot(path)
    31  		s.Start()
    32  		defer s.Shutdown()
    33  		time.Sleep(100 * time.Millisecond)
    34  		client := g.Client()
    35  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
    36  
    37  		t.Assert(client.GetContent(ctx, "/"), "index")
    38  		t.Assert(client.GetContent(ctx, "/index.htm"), "index")
    39  	})
    40  
    41  	// SetServerRoot with relative path
    42  	gtest.C(t, func(t *gtest.T) {
    43  		s := g.Server(guid.S())
    44  		path := fmt.Sprintf(`static/test/%d`, s.GetListenedPort())
    45  		defer gfile.Remove(path)
    46  		gfile.PutContents(path+"/index.htm", "index")
    47  		s.SetServerRoot(path)
    48  		s.Start()
    49  		defer s.Shutdown()
    50  		time.Sleep(100 * time.Millisecond)
    51  		client := g.Client()
    52  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
    53  
    54  		t.Assert(client.GetContent(ctx, "/"), "index")
    55  		t.Assert(client.GetContent(ctx, "/index.htm"), "index")
    56  	})
    57  }
    58  
    59  func Test_Static_ServerRoot_Security(t *testing.T) {
    60  	gtest.C(t, func(t *gtest.T) {
    61  		s := g.Server(guid.S())
    62  		s.SetServerRoot(gtest.DataPath("static1"))
    63  		s.Start()
    64  		defer s.Shutdown()
    65  		time.Sleep(100 * time.Millisecond)
    66  		client := g.Client()
    67  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
    68  
    69  		t.Assert(client.GetContent(ctx, "/"), "index")
    70  		t.Assert(client.GetContent(ctx, "/index.htm"), "Not Found")
    71  		t.Assert(client.GetContent(ctx, "/index.html"), "index")
    72  		t.Assert(client.GetContent(ctx, "/test.html"), "test")
    73  		t.Assert(client.GetContent(ctx, "/../main.html"), "Not Found")
    74  		t.Assert(client.GetContent(ctx, "/..%2Fmain.html"), "Not Found")
    75  	})
    76  }
    77  
    78  func Test_Static_Folder_Forbidden(t *testing.T) {
    79  	gtest.C(t, func(t *gtest.T) {
    80  		s := g.Server(guid.S())
    81  		path := fmt.Sprintf(`%s/ghttp/static/test/%d`, gfile.Temp(), s.GetListenedPort())
    82  		defer gfile.Remove(path)
    83  		gfile.PutContents(path+"/test.html", "test")
    84  		s.SetServerRoot(path)
    85  		s.Start()
    86  		defer s.Shutdown()
    87  		time.Sleep(100 * time.Millisecond)
    88  		client := g.Client()
    89  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
    90  
    91  		t.Assert(client.GetContent(ctx, "/"), "Forbidden")
    92  		t.Assert(client.GetContent(ctx, "/index.html"), "Not Found")
    93  		t.Assert(client.GetContent(ctx, "/test.html"), "test")
    94  	})
    95  }
    96  
    97  func Test_Static_IndexFolder(t *testing.T) {
    98  	gtest.C(t, func(t *gtest.T) {
    99  		s := g.Server(guid.S())
   100  		path := fmt.Sprintf(`%s/ghttp/static/test/%d`, gfile.Temp(), s.GetListenedPort())
   101  		defer gfile.Remove(path)
   102  		gfile.PutContents(path+"/test.html", "test")
   103  		s.SetIndexFolder(true)
   104  		s.SetServerRoot(path)
   105  		s.Start()
   106  		defer s.Shutdown()
   107  		time.Sleep(100 * time.Millisecond)
   108  		client := g.Client()
   109  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   110  
   111  		t.AssertNE(client.GetContent(ctx, "/"), "Forbidden")
   112  		t.AssertNE(gstr.Pos(client.GetContent(ctx, "/"), `<a href="/test.html"`), -1)
   113  		t.Assert(client.GetContent(ctx, "/index.html"), "Not Found")
   114  		t.Assert(client.GetContent(ctx, "/test.html"), "test")
   115  	})
   116  }
   117  
   118  func Test_Static_IndexFiles1(t *testing.T) {
   119  	gtest.C(t, func(t *gtest.T) {
   120  		s := g.Server(guid.S())
   121  		path := fmt.Sprintf(`%s/ghttp/static/test/%d`, gfile.Temp(), s.GetListenedPort())
   122  		defer gfile.Remove(path)
   123  		gfile.PutContents(path+"/index.html", "index")
   124  		gfile.PutContents(path+"/test.html", "test")
   125  		s.SetServerRoot(path)
   126  		s.Start()
   127  		defer s.Shutdown()
   128  		time.Sleep(100 * time.Millisecond)
   129  		client := g.Client()
   130  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   131  
   132  		t.Assert(client.GetContent(ctx, "/"), "index")
   133  		t.Assert(client.GetContent(ctx, "/index.html"), "index")
   134  		t.Assert(client.GetContent(ctx, "/test.html"), "test")
   135  	})
   136  }
   137  
   138  func Test_Static_IndexFiles2(t *testing.T) {
   139  	gtest.C(t, func(t *gtest.T) {
   140  		s := g.Server(guid.S())
   141  		path := fmt.Sprintf(`%s/ghttp/static/test/%d`, gfile.Temp(), s.GetListenedPort())
   142  		defer gfile.Remove(path)
   143  		gfile.PutContents(path+"/test.html", "test")
   144  		s.SetIndexFiles([]string{"index.html", "test.html"})
   145  		s.SetServerRoot(path)
   146  		s.Start()
   147  		defer s.Shutdown()
   148  		time.Sleep(100 * time.Millisecond)
   149  		client := g.Client()
   150  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   151  
   152  		t.Assert(client.GetContent(ctx, "/"), "test")
   153  		t.Assert(client.GetContent(ctx, "/index.html"), "Not Found")
   154  		t.Assert(client.GetContent(ctx, "/test.html"), "test")
   155  	})
   156  }
   157  
   158  func Test_Static_AddSearchPath1(t *testing.T) {
   159  	gtest.C(t, func(t *gtest.T) {
   160  		s := g.Server(guid.S())
   161  		path1 := fmt.Sprintf(`%s/ghttp/static/test/%d`, gfile.Temp(), s.GetListenedPort())
   162  		path2 := fmt.Sprintf(`%s/ghttp/static/test/%d/%d`, gfile.Temp(), s.GetListenedPort(), s.GetListenedPort())
   163  		defer gfile.Remove(path1)
   164  		defer gfile.Remove(path2)
   165  		gfile.PutContents(path2+"/test.html", "test")
   166  		s.SetServerRoot(path1)
   167  		s.AddSearchPath(path2)
   168  		s.Start()
   169  		defer s.Shutdown()
   170  		time.Sleep(100 * time.Millisecond)
   171  		client := g.Client()
   172  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   173  
   174  		t.Assert(client.GetContent(ctx, "/"), "Forbidden")
   175  		t.Assert(client.GetContent(ctx, "/test.html"), "test")
   176  	})
   177  }
   178  
   179  func Test_Static_AddSearchPath2(t *testing.T) {
   180  	gtest.C(t, func(t *gtest.T) {
   181  		s := g.Server(guid.S())
   182  		path1 := fmt.Sprintf(`%s/ghttp/static/test/%d`, gfile.Temp(), s.GetListenedPort())
   183  		path2 := fmt.Sprintf(`%s/ghttp/static/test/%d/%d`, gfile.Temp(), s.GetListenedPort(), s.GetListenedPort())
   184  		defer gfile.Remove(path1)
   185  		defer gfile.Remove(path2)
   186  		gfile.PutContents(path1+"/test.html", "test1")
   187  		gfile.PutContents(path2+"/test.html", "test2")
   188  		s.SetServerRoot(path1)
   189  		s.AddSearchPath(path2)
   190  		s.Start()
   191  		defer s.Shutdown()
   192  		time.Sleep(100 * time.Millisecond)
   193  		client := g.Client()
   194  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   195  
   196  		t.Assert(client.GetContent(ctx, "/"), "Forbidden")
   197  		t.Assert(client.GetContent(ctx, "/test.html"), "test1")
   198  	})
   199  }
   200  
   201  func Test_Static_AddStaticPath(t *testing.T) {
   202  	gtest.C(t, func(t *gtest.T) {
   203  		s := g.Server(guid.S())
   204  		path1 := fmt.Sprintf(`%s/ghttp/static/test/%d`, gfile.Temp(), s.GetListenedPort())
   205  		path2 := fmt.Sprintf(`%s/ghttp/static/test/%d/%d`, gfile.Temp(), s.GetListenedPort(), s.GetListenedPort())
   206  		defer gfile.Remove(path1)
   207  		defer gfile.Remove(path2)
   208  		gfile.PutContents(path1+"/test.html", "test1")
   209  		gfile.PutContents(path2+"/test.html", "test2")
   210  		s.SetServerRoot(path1)
   211  		s.AddStaticPath("/my-test", path2)
   212  		s.Start()
   213  		defer s.Shutdown()
   214  		time.Sleep(100 * time.Millisecond)
   215  		client := g.Client()
   216  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   217  
   218  		t.Assert(client.GetContent(ctx, "/"), "Forbidden")
   219  		t.Assert(client.GetContent(ctx, "/test.html"), "test1")
   220  		t.Assert(client.GetContent(ctx, "/my-test/test.html"), "test2")
   221  	})
   222  }
   223  
   224  func Test_Static_AddStaticPath_Priority(t *testing.T) {
   225  	gtest.C(t, func(t *gtest.T) {
   226  		s := g.Server(guid.S())
   227  		path1 := fmt.Sprintf(`%s/ghttp/static/test/%d/test`, gfile.Temp(), s.GetListenedPort())
   228  		path2 := fmt.Sprintf(`%s/ghttp/static/test/%d/%d/test`, gfile.Temp(), s.GetListenedPort(), s.GetListenedPort())
   229  		defer gfile.Remove(path1)
   230  		defer gfile.Remove(path2)
   231  		gfile.PutContents(path1+"/test.html", "test1")
   232  		gfile.PutContents(path2+"/test.html", "test2")
   233  		s.SetServerRoot(path1)
   234  		s.AddStaticPath("/test", path2)
   235  		s.Start()
   236  		defer s.Shutdown()
   237  		time.Sleep(100 * time.Millisecond)
   238  		client := g.Client()
   239  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   240  
   241  		t.Assert(client.GetContent(ctx, "/"), "Forbidden")
   242  		t.Assert(client.GetContent(ctx, "/test.html"), "test1")
   243  		t.Assert(client.GetContent(ctx, "/test/test.html"), "test2")
   244  	})
   245  }
   246  
   247  func Test_Static_Rewrite(t *testing.T) {
   248  	gtest.C(t, func(t *gtest.T) {
   249  		s := g.Server(guid.S())
   250  		path := fmt.Sprintf(`%s/ghttp/static/test/%d`, gfile.Temp(), s.GetListenedPort())
   251  		defer gfile.Remove(path)
   252  		gfile.PutContents(path+"/test1.html", "test1")
   253  		gfile.PutContents(path+"/test2.html", "test2")
   254  		s.SetServerRoot(path)
   255  		s.SetRewrite("/test.html", "/test1.html")
   256  		s.SetRewriteMap(g.MapStrStr{
   257  			"/my-test1": "/test1.html",
   258  			"/my-test2": "/test2.html",
   259  		})
   260  		s.SetDumpRouterMap(false)
   261  		s.Start()
   262  		defer s.Shutdown()
   263  		time.Sleep(100 * time.Millisecond)
   264  		client := g.Client()
   265  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   266  
   267  		t.Assert(client.GetContent(ctx, "/"), "Forbidden")
   268  		t.Assert(client.GetContent(ctx, "/test.html"), "test1")
   269  		t.Assert(client.GetContent(ctx, "/test1.html"), "test1")
   270  		t.Assert(client.GetContent(ctx, "/test2.html"), "test2")
   271  		t.Assert(client.GetContent(ctx, "/my-test1"), "test1")
   272  		t.Assert(client.GetContent(ctx, "/my-test2"), "test2")
   273  	})
   274  }