Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[question] Gorilla/Mux SPA not working #2

Open
tebruno99 opened this issue Dec 15, 2022 · 3 comments
Open

[question] Gorilla/Mux SPA not working #2

tebruno99 opened this issue Dec 15, 2022 · 3 comments
Labels
question Further information is requested

Comments

@tebruno99
Copy link

tebruno99 commented Dec 15, 2022

MIGRATED
From mux created by AstroNik: gorilla#588

Problem

So I'm not really sure if this is a bug or anything, and this is also my first bug report so I apologize for my lack of knowledge on correctly reporting a bug.

I was trying to create a SPA using gorilla/mux and kept running into issues with displaying my webpage. I knew my code was correct but it had something to do with the file paths inside the SPA handler itself because when I was running my code I was getting a StatusInternalServerError. All my file paths were correct so it had to be something with the ServeHTTP function itself. I later found it to be an issue with the path as shown below.

Versions

go version go1.13.4 windows/amd64

github.com/gorilla/mux v1.7.4

main.go

type spaHandler struct {
	staticPath string
	indexPath  string
}

func (h spaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	path, err := filepath.Abs(r.URL.Path)
	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}

	path = filepath.Join(h.staticPath, path) //this is the part of the code I changed to fix my issue

	_, err = os.Stat(path)
	if os.IsNotExist(err) {
		http.ServeFile(w, r, filepath.Join(h.staticPath, h.indexPath))
		return
	} else if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	http.FileServer(http.Dir(h.staticPath)).ServeHTTP(w, r)
}

func main() {
	router := mux.NewRouter()
	spa := spaHandler{staticPath: "./admin/build", indexPath: "index.html"}
	router.PathPrefix("/").Handler(spa)
	log.Fatal(http.ListenAndServe(":8080", router))
}

Code was changed to below, and started to work perfectly fine.

path = filepath.Join(h.staticPath, r.URL.Path) 

I don't know whether or not to report this as a fix to the actual public code or not. Still new to contributing.

@tebruno99 tebruno99 added the question Further information is requested label Dec 15, 2022
@tebruno99
Copy link
Author

tebruno99 commented Dec 15, 2022

MIGRATED
Original Post: @DJviolin gorilla#588 (comment)

Confirming I have the same problem with the example SPA code (using Windows).

	// get the absolute path to prevent directory traversal
	path, err := filepath.Abs(r.URL.Path)
	if err != nil {
		// if we failed to get the absolute path respond with a 400 bad request
		// and stop
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}
	fmt.Println(path) // returns: D:\

	// prepend the path with the path to the static directory

	path = filepath.Join(h.StaticPath, path)
	fmt.Println(path) // returns: build\D:

	path = filepath.Join(h.StaticPath, r.URL.Path)
	fmt.Println(path) // returns: build

@tebruno99
Copy link
Author

tebruno99 commented Dec 15, 2022

MIGRATED
Original Post: @thibaultleblanc gorilla#588 (comment)

This problem appears on windows.
For an unknown reason filepath.abs returns the storage letter, so the path begins with "C:/" (or "D:/", or whatever letter followed by ":/"), just replace "C:/" by "/" and it will works great !

path, err := filepath.Abs(r.URL.Path)
path = strings.Replace(path, `C:\`, "/", 1)

Solution found on reddit :
https://www.reddit.com/r/golang/comments/pvltgk/having_trouble_getting_the_gorillamux_single_page/

I'm beginner in golang (even more with windows stuff) so i don't feel comfortable to make a pull request but at least here is quick and dirty hotfix !

tebruno99 added a commit that referenced this issue Dec 15, 2022
@tebruno99
Copy link
Author

Merging to temp branch to review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

When branches are created from issues, their pull requests are automatically linked.

1 participant