From e1c09549e5ed8c4971cef7fd232f547ad646f6e2 Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Tue, 14 Mar 2023 21:21:26 +0800 Subject: [PATCH 01/13] feat: use same page style as python's --- pkg/httpserver/httpserver.go | 2 +- pkg/httpserver/pythonliststyle.go | 81 +++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 pkg/httpserver/pythonliststyle.go diff --git a/pkg/httpserver/httpserver.go b/pkg/httpserver/httpserver.go index 94c050e..e392ed5 100644 --- a/pkg/httpserver/httpserver.go +++ b/pkg/httpserver/httpserver.go @@ -57,7 +57,7 @@ func New(options *Options) (*HTTPServer, error) { dir = SandboxFileSystem{fs: http.Dir(options.Folder), RootFolder: options.Folder} } - httpHandler := http.FileServer(dir) + httpHandler := PythonStyle(http.FileServer(dir)) addHandler := func(newHandler Middleware) { httpHandler = newHandler(httpHandler) } diff --git a/pkg/httpserver/pythonliststyle.go b/pkg/httpserver/pythonliststyle.go new file mode 100644 index 0000000..f2f1065 --- /dev/null +++ b/pkg/httpserver/pythonliststyle.go @@ -0,0 +1,81 @@ +package httpserver + +import ( + "bytes" + "fmt" + "io" + "net/http" +) + +const ( + preTag = "
"
+	preTagClose = "
" + aTag = " + + + +Directory listing for / + + +` + htmlFooter = `
+ + +` +) + +type pythonStyleHandler struct { + origWriter http.ResponseWriter + goFileServer http.Handler +} + +func (h pythonStyleHandler) Header() http.Header { + return h.origWriter.Header() +} + +func (h pythonStyleHandler) Write(b []byte) (int, error) { + var i int + written := 0 + + if bytes.HasPrefix(b, []byte(preTag)) { + _, _ = io.Discard.Write(b) + i, _ = fmt.Fprintln(h.origWriter, "") + written += i + return written, nil + } + + if bytes.HasPrefix(b, []byte(aTag)) { + i, _ = fmt.Fprint(h.origWriter, "
  • ") + written += i + i, _ = h.origWriter.Write(bytes.Trim(b, "\r\n")) + written += i + i, _ = fmt.Fprint(h.origWriter, "
  • \n") + written += i + } + return i, nil +} + +func (h pythonStyleHandler) WriteHeader(statusCode int) { + h.origWriter.WriteHeader(statusCode) +} + +func (h pythonStyleHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { + h.origWriter = writer + _, _ = fmt.Fprint(h.origWriter, htmlHeader) + _, _ = fmt.Fprintf(h.origWriter, "

    Directory listing for %s

    \n
    \n", request.URL.Path) + h.goFileServer.ServeHTTP(h, request) + _, _ = fmt.Fprint(h.origWriter, htmlFooter) +} + +func PythonStyle(handler http.Handler) http.Handler { + return pythonStyleHandler{ + goFileServer: handler, + } +} From 971d31ee680d1624ee7b4fc3cc177c894a06fe33 Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Tue, 14 Mar 2023 21:21:41 +0800 Subject: [PATCH 02/13] test: pythonliststyle_test.go --- test/fixture/pythonliststyle/test file.txt | 0 test/pythonliststyle_test.go | 40 ++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 test/fixture/pythonliststyle/test file.txt create mode 100644 test/pythonliststyle_test.go diff --git a/test/fixture/pythonliststyle/test file.txt b/test/fixture/pythonliststyle/test file.txt new file mode 100644 index 0000000..e69de29 diff --git a/test/pythonliststyle_test.go b/test/pythonliststyle_test.go new file mode 100644 index 0000000..7307406 --- /dev/null +++ b/test/pythonliststyle_test.go @@ -0,0 +1,40 @@ +package test + +import ( + "github.com/projectdiscovery/simplehttpserver/pkg/httpserver" + "io" + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +const want = ` + + + +Directory listing for / + + +

    Directory listing for /

    +
    + +
    + + +` + +func TestWritePythonStyleHtmlPage(t *testing.T) { + py := httpserver.PythonStyle(http.FileServer(http.Dir("./fixture/pythonliststyle"))) + + w := httptest.NewRecorder() + py.ServeHTTP(w, httptest.NewRequest("GET", "http://example.com/", nil)) + b, _ := io.ReadAll(w.Result().Body) + + body := string(b) + if strings.Compare(want, body) != 0 { + t.Errorf("want:\n%s\ngot:\n%s", want, body) + } +} From 2a8f8fd1697b7d85ff51d4da157623ba6aec2aed Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Tue, 14 Mar 2023 21:25:39 +0800 Subject: [PATCH 03/13] refactor: make it clearer that we surround original html with proper header and footer --- pkg/httpserver/pythonliststyle.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/httpserver/pythonliststyle.go b/pkg/httpserver/pythonliststyle.go index f2f1065..e41c2ed 100644 --- a/pkg/httpserver/pythonliststyle.go +++ b/pkg/httpserver/pythonliststyle.go @@ -67,11 +67,13 @@ func (h pythonStyleHandler) WriteHeader(statusCode int) { } func (h pythonStyleHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { + _, _ = fmt.Fprint(writer, htmlHeader) + _, _ = fmt.Fprintf(writer, "

    Directory listing for %s

    \n
    \n", request.URL.Path) + h.origWriter = writer - _, _ = fmt.Fprint(h.origWriter, htmlHeader) - _, _ = fmt.Fprintf(h.origWriter, "

    Directory listing for %s

    \n
    \n", request.URL.Path) h.goFileServer.ServeHTTP(h, request) - _, _ = fmt.Fprint(h.origWriter, htmlFooter) + + _, _ = fmt.Fprint(writer, htmlFooter) } func PythonStyle(handler http.Handler) http.Handler { From ffb26a3a96fdcad853d41819a4a738f0cef6c1f6 Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Tue, 14 Mar 2023 21:29:38 +0800 Subject: [PATCH 04/13] refactor: explain what these lines do --- pkg/httpserver/pythonliststyle.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/pkg/httpserver/pythonliststyle.go b/pkg/httpserver/pythonliststyle.go index e41c2ed..5bdb9ff 100644 --- a/pkg/httpserver/pythonliststyle.go +++ b/pkg/httpserver/pythonliststyle.go @@ -34,6 +34,16 @@ func (h pythonStyleHandler) Header() http.Header { return h.origWriter.Header() } +func (h pythonStyleHandler) writeListItem(b []byte, written *int) { + var i int + i, _ = fmt.Fprint(h.origWriter, "
  • ") + *written += i + i, _ = h.origWriter.Write(bytes.Trim(b, "\r\n")) + *written += i + i, _ = fmt.Fprint(h.origWriter, "
  • \n") + *written += i +} + func (h pythonStyleHandler) Write(b []byte) (int, error) { var i int written := 0 @@ -52,12 +62,7 @@ func (h pythonStyleHandler) Write(b []byte) (int, error) { } if bytes.HasPrefix(b, []byte(aTag)) { - i, _ = fmt.Fprint(h.origWriter, "
  • ") - written += i - i, _ = h.origWriter.Write(bytes.Trim(b, "\r\n")) - written += i - i, _ = fmt.Fprint(h.origWriter, "
  • \n") - written += i + h.writeListItem(b, &written) } return i, nil } From ffffe3a9bc4afab18bf12eec6964562822a9623f Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Tue, 14 Mar 2023 21:42:21 +0800 Subject: [PATCH 05/13] fix: html title is not updated as URL path changes --- pkg/httpserver/pythonliststyle.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/httpserver/pythonliststyle.go b/pkg/httpserver/pythonliststyle.go index 5bdb9ff..8e0bdc0 100644 --- a/pkg/httpserver/pythonliststyle.go +++ b/pkg/httpserver/pythonliststyle.go @@ -15,7 +15,7 @@ const ( -Directory listing for / +Directory listing for %s ` @@ -72,7 +72,7 @@ func (h pythonStyleHandler) WriteHeader(statusCode int) { } func (h pythonStyleHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { - _, _ = fmt.Fprint(writer, htmlHeader) + _, _ = fmt.Fprintf(writer, htmlHeader, request.URL.Path) _, _ = fmt.Fprintf(writer, "

    Directory listing for %s

    \n
    \n", request.URL.Path) h.origWriter = writer From d36c14316c7d5904d6fb74786f0f5b7844048627 Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Tue, 14 Mar 2023 22:04:54 +0800 Subject: [PATCH 06/13] doc: explain what this fork is for --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 0363d59..4b62cf8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +> This fork returns HTML that has same style as python's` +

    SimpleHTTPserver

    Go alternative of python SimpleHTTPServer

    From 24781d4114281c238be6347e413df053d52e4061 Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Wed, 15 Mar 2023 12:08:02 +0800 Subject: [PATCH 07/13] doc: typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b62cf8..775f295 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -> This fork returns HTML that has same style as python's` +> This fork returns HTML that has same style as python's

    SimpleHTTPserver

    Go alternative of python SimpleHTTPServer

    From 6d4a3dbfdad17dce47eb4313fd0407c03d5563d3 Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Wed, 15 Mar 2023 14:43:41 +0800 Subject: [PATCH 08/13] test: serve a file --- test/fixture/pythonliststyle/test file.txt | 2 ++ test/pythonliststyle_test.go | 27 ++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/test/fixture/pythonliststyle/test file.txt b/test/fixture/pythonliststyle/test file.txt index e69de29..5cd8fbc 100644 --- a/test/fixture/pythonliststyle/test file.txt +++ b/test/fixture/pythonliststyle/test file.txt @@ -0,0 +1,2 @@ +This is the content of "test file.txt". +这是“test file.txt”文件的内容。 diff --git a/test/pythonliststyle_test.go b/test/pythonliststyle_test.go index 7307406..254286c 100644 --- a/test/pythonliststyle_test.go +++ b/test/pythonliststyle_test.go @@ -1,15 +1,17 @@ package test import ( + "bytes" "github.com/projectdiscovery/simplehttpserver/pkg/httpserver" "io" - "net/http" "net/http/httptest" + "os" "strings" "testing" ) -const want = ` +func TestWritePythonStyleHtmlPageForDirectories(t *testing.T) { + const want = ` @@ -25,9 +27,7 @@ const want = ` ` - -func TestWritePythonStyleHtmlPage(t *testing.T) { - py := httpserver.PythonStyle(http.FileServer(http.Dir("./fixture/pythonliststyle"))) + py := httpserver.PythonStyle("./fixture/pythonliststyle") w := httptest.NewRecorder() py.ServeHTTP(w, httptest.NewRequest("GET", "http://example.com/", nil)) @@ -38,3 +38,20 @@ func TestWritePythonStyleHtmlPage(t *testing.T) { t.Errorf("want:\n%s\ngot:\n%s", want, body) } } + +func TestServeFileContentForFiles(t *testing.T) { + want, _ := os.ReadFile("./fixture/pythonliststyle/test file.txt") + + py := httpserver.PythonStyle("./fixture/pythonliststyle") + + w := httptest.NewRecorder() + py.ServeHTTP(w, httptest.NewRequest( + "GET", + "http://example.com/test%20file.txt", + nil, + )) + got, _ := io.ReadAll(w.Result().Body) + if bytes.Compare(want, got) != 0 { + t.Errorf("want:\n%x\ngot:\n%x", want, got) + } +} From 447cc0ebcd70dedfb3a8ffe3d375fcc8bbd01544 Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Wed, 15 Mar 2023 15:37:36 +0800 Subject: [PATCH 09/13] fix: file is not served properly --- pkg/httpserver/httpserver.go | 2 +- pkg/httpserver/pythonliststyle.go | 40 ++++++++++++++++++------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/pkg/httpserver/httpserver.go b/pkg/httpserver/httpserver.go index e392ed5..197ba8e 100644 --- a/pkg/httpserver/httpserver.go +++ b/pkg/httpserver/httpserver.go @@ -57,7 +57,7 @@ func New(options *Options) (*HTTPServer, error) { dir = SandboxFileSystem{fs: http.Dir(options.Folder), RootFolder: options.Folder} } - httpHandler := PythonStyle(http.FileServer(dir)) + httpHandler := PythonStyle(dir.(http.Dir)) addHandler := func(newHandler Middleware) { httpHandler = newHandler(httpHandler) } diff --git a/pkg/httpserver/pythonliststyle.go b/pkg/httpserver/pythonliststyle.go index 8e0bdc0..3a4c85f 100644 --- a/pkg/httpserver/pythonliststyle.go +++ b/pkg/httpserver/pythonliststyle.go @@ -5,6 +5,8 @@ import ( "fmt" "io" "net/http" + "os" + "path" ) const ( @@ -26,15 +28,15 @@ const ( ) type pythonStyleHandler struct { - origWriter http.ResponseWriter - goFileServer http.Handler + origWriter http.ResponseWriter + root http.Dir } -func (h pythonStyleHandler) Header() http.Header { +func (h *pythonStyleHandler) Header() http.Header { return h.origWriter.Header() } -func (h pythonStyleHandler) writeListItem(b []byte, written *int) { +func (h *pythonStyleHandler) writeListItem(b []byte, written *int) { var i int i, _ = fmt.Fprint(h.origWriter, "
  • ") *written += i @@ -44,7 +46,7 @@ func (h pythonStyleHandler) writeListItem(b []byte, written *int) { *written += i } -func (h pythonStyleHandler) Write(b []byte) (int, error) { +func (h *pythonStyleHandler) Write(b []byte) (int, error) { var i int written := 0 @@ -67,22 +69,28 @@ func (h pythonStyleHandler) Write(b []byte) (int, error) { return i, nil } -func (h pythonStyleHandler) WriteHeader(statusCode int) { +func (h *pythonStyleHandler) WriteHeader(statusCode int) { h.origWriter.WriteHeader(statusCode) } -func (h pythonStyleHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { - _, _ = fmt.Fprintf(writer, htmlHeader, request.URL.Path) - _, _ = fmt.Fprintf(writer, "

    Directory listing for %s

    \n
    \n", request.URL.Path) +func (h *pythonStyleHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { + target := path.Join(string(h.root), path.Clean(request.URL.Path)) + file, _ := os.Stat(target) - h.origWriter = writer - h.goFileServer.ServeHTTP(h, request) - - _, _ = fmt.Fprint(writer, htmlFooter) + if !file.IsDir() { + http.ServeFile(writer, request, target) + return + } else { + _, _ = fmt.Fprintf(writer, htmlHeader, request.URL.Path) + _, _ = fmt.Fprintf(writer, "

    Directory listing for %s

    \n
    \n", request.URL.Path) + h.origWriter = writer + http.ServeFile(h, request, target) + _, _ = fmt.Fprint(writer, htmlFooter) + } } -func PythonStyle(handler http.Handler) http.Handler { - return pythonStyleHandler{ - goFileServer: handler, +func PythonStyle(root http.Dir) http.Handler { + return &pythonStyleHandler{ + root: root, } } From e33a7bd0ed0830c066d4b7e857e30304668d721e Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Wed, 15 Mar 2023 15:39:05 +0800 Subject: [PATCH 10/13] reword --- test/pythonliststyle_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pythonliststyle_test.go b/test/pythonliststyle_test.go index 254286c..9c2c899 100644 --- a/test/pythonliststyle_test.go +++ b/test/pythonliststyle_test.go @@ -10,7 +10,7 @@ import ( "testing" ) -func TestWritePythonStyleHtmlPageForDirectories(t *testing.T) { +func TestServePythonStyleHtmlPageForDirectories(t *testing.T) { const want = ` From bd77ace04942d6ff1f6d8ddf5ca098f9af1da91b Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Wed, 15 Mar 2023 20:59:00 +0800 Subject: [PATCH 11/13] lint: accept gosimple's suggestion --- test/pythonliststyle_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pythonliststyle_test.go b/test/pythonliststyle_test.go index 9c2c899..9e97e5c 100644 --- a/test/pythonliststyle_test.go +++ b/test/pythonliststyle_test.go @@ -51,7 +51,7 @@ func TestServeFileContentForFiles(t *testing.T) { nil, )) got, _ := io.ReadAll(w.Result().Body) - if bytes.Compare(want, got) != 0 { + if !bytes.Equal(want, got) { t.Errorf("want:\n%x\ngot:\n%x", want, got) } } From e9b260efaa11030e28b561b698657c1aae371a10 Mon Sep 17 00:00:00 2001 From: li6in9muyou Date: Thu, 16 Mar 2023 09:47:40 +0800 Subject: [PATCH 12/13] fix: handles any os.Stat() error --- pkg/httpserver/pythonliststyle.go | 4 ++-- test/pythonliststyle_test.go | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/pkg/httpserver/pythonliststyle.go b/pkg/httpserver/pythonliststyle.go index 3a4c85f..107acc9 100644 --- a/pkg/httpserver/pythonliststyle.go +++ b/pkg/httpserver/pythonliststyle.go @@ -75,9 +75,9 @@ func (h *pythonStyleHandler) WriteHeader(statusCode int) { func (h *pythonStyleHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { target := path.Join(string(h.root), path.Clean(request.URL.Path)) - file, _ := os.Stat(target) + file, err := os.Stat(target) - if !file.IsDir() { + if err != nil || !file.IsDir() { http.ServeFile(writer, request, target) return } else { diff --git a/test/pythonliststyle_test.go b/test/pythonliststyle_test.go index 9c2c899..d416727 100644 --- a/test/pythonliststyle_test.go +++ b/test/pythonliststyle_test.go @@ -55,3 +55,21 @@ func TestServeFileContentForFiles(t *testing.T) { t.Errorf("want:\n%x\ngot:\n%x", want, got) } } + +func TestResponseNotFound(t *testing.T) { + const want = `404 page not found +` + + py := httpserver.PythonStyle("./fixture/pythonliststyle") + + w := httptest.NewRecorder() + py.ServeHTTP(w, httptest.NewRequest( + "GET", + "http://example.com/does-not-exist.txt", + nil, + )) + got, _ := io.ReadAll(w.Result().Body) + if strings.Compare(want, string(got)) != 0 { + t.Errorf("want:\n%s\ngot:\n%s", want, got) + } +} From ccda8e73b0ee6821af5941ac2dc21fa78b2aed4f Mon Sep 17 00:00:00 2001 From: Mzack9999 Date: Thu, 16 Mar 2023 19:41:53 +0100 Subject: [PATCH 13/13] made python style optional --- README.md | 3 +-- internal/runner/options.go | 42 ++++++++++++++++--------------- internal/runner/runner.go | 1 + pkg/httpserver/httpserver.go | 9 ++++++- pkg/httpserver/pythonliststyle.go | 4 +-- pkg/httpserver/uploadlayer.go | 2 +- 6 files changed, 35 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 775f295..f84d024 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -> This fork returns HTML that has same style as python's -

    SimpleHTTPserver

    Go alternative of python SimpleHTTPServer

    @@ -71,6 +69,7 @@ This will display help for the tool. Here are all the switches it supports. | `-realm` | Basic auth message | `simplehttpserver -realm "insert the credentials"` | | `-version` | Show version | `simplehttpserver -version` | | `-silent` | Show only results | `simplehttpserver -silent` | +| `-py` | Emulate Python Style | `simplehttpserver -py` | ### Running simplehttpserver in the current folder diff --git a/internal/runner/options.go b/internal/runner/options.go index 5086d8a..386ee3b 100644 --- a/internal/runner/options.go +++ b/internal/runner/options.go @@ -12,27 +12,28 @@ import ( // Options of the tool type Options struct { - ListenAddress string - Folder string - BasicAuth string - username string - password string - Realm string - TLSCertificate string - TLSKey string - TLSDomain string - HTTPS bool - Verbose bool - EnableUpload bool - EnableTCP bool - RulesFile string - TCPWithTLS bool - Version bool - Silent bool - Sandbox bool - MaxFileSize int - HTTP1Only bool + ListenAddress string + Folder string + BasicAuth string + username string + password string + Realm string + TLSCertificate string + TLSKey string + TLSDomain string + HTTPS bool + Verbose bool + EnableUpload bool + EnableTCP bool + RulesFile string + TCPWithTLS bool + Version bool + Silent bool + Sandbox bool + MaxFileSize int + HTTP1Only bool MaxDumpBodySize int + Python bool } // ParseOptions parses the command line options for application @@ -61,6 +62,7 @@ func ParseOptions() *Options { flag.BoolVar(&options.HTTP1Only, "http1", false, "Enable only HTTP1") flag.IntVar(&options.MaxFileSize, "max-file-size", 50, "Max Upload File Size") flag.IntVar(&options.MaxDumpBodySize, "max-dump-body-size", -1, "Max Dump Body Size") + flag.BoolVar(&options.Python, "py", false, "Emulate Python Style") flag.Parse() // Read the inputs and configure the logging diff --git a/internal/runner/runner.go b/internal/runner/runner.go index 59c28e3..298e755 100644 --- a/internal/runner/runner.go +++ b/internal/runner/runner.go @@ -68,6 +68,7 @@ func New(options *Options) (*Runner, error) { MaxFileSize: r.options.MaxFileSize, HTTP1Only: r.options.HTTP1Only, MaxDumpBodySize: unit.ToMb(r.options.MaxDumpBodySize), + Python: r.options.Python, }) if err != nil { return nil, err diff --git a/pkg/httpserver/httpserver.go b/pkg/httpserver/httpserver.go index 197ba8e..73e6cc5 100644 --- a/pkg/httpserver/httpserver.go +++ b/pkg/httpserver/httpserver.go @@ -27,6 +27,7 @@ type Options struct { HTTP1Only bool MaxFileSize int // 50Mb MaxDumpBodySize int64 + Python bool } // HTTPServer instance @@ -57,7 +58,13 @@ func New(options *Options) (*HTTPServer, error) { dir = SandboxFileSystem{fs: http.Dir(options.Folder), RootFolder: options.Folder} } - httpHandler := PythonStyle(dir.(http.Dir)) + var httpHandler http.Handler + if options.Python { + httpHandler = PythonStyle(dir.(http.Dir)) + } else { + httpHandler = http.FileServer(dir) + } + addHandler := func(newHandler Middleware) { httpHandler = newHandler(httpHandler) } diff --git a/pkg/httpserver/pythonliststyle.go b/pkg/httpserver/pythonliststyle.go index 107acc9..65c6b0a 100644 --- a/pkg/httpserver/pythonliststyle.go +++ b/pkg/httpserver/pythonliststyle.go @@ -6,7 +6,7 @@ import ( "io" "net/http" "os" - "path" + "path/filepath" ) const ( @@ -74,7 +74,7 @@ func (h *pythonStyleHandler) WriteHeader(statusCode int) { } func (h *pythonStyleHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { - target := path.Join(string(h.root), path.Clean(request.URL.Path)) + target := filepath.Join(string(h.root), filepath.Clean(request.URL.Path)) file, err := os.Stat(target) if err != nil || !file.IsDir() { diff --git a/pkg/httpserver/uploadlayer.go b/pkg/httpserver/uploadlayer.go index 670d75a..4064714 100644 --- a/pkg/httpserver/uploadlayer.go +++ b/pkg/httpserver/uploadlayer.go @@ -91,7 +91,7 @@ func handleUpload(base, file string, data []byte) error { } trustedPath := untrustedPath - if _, err := os.Stat(path.Dir(trustedPath)); os.IsNotExist(err) { + if _, err := os.Stat(filepath.Dir(trustedPath)); os.IsNotExist(err) { return errors.New("invalid path") }