correct load of subpage when standalone binary ability to set external videourl when using standalone binary
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // +build static
 | |
| 
 | |
| package static
 | |
| 
 | |
| import (
 | |
| 	"embed"
 | |
| 	"fmt"
 | |
| 	"io/fs"
 | |
| 	"net/http"
 | |
| 	"net/http/httputil"
 | |
| 	"net/url"
 | |
| 	"openmediacenter/apiGo/database/settings"
 | |
| 	"regexp"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| //go:embed build
 | |
| var staticFiles embed.FS
 | |
| 
 | |
| func ServeStaticFiles() {
 | |
| 	// http.FS can be used to create a http Filesystem
 | |
| 	subfs, _ := fs.Sub(staticFiles, "build")
 | |
| 	staticFS := http.FS(subfs)
 | |
| 	fs := http.FileServer(staticFS)
 | |
| 
 | |
| 	// Serve static files
 | |
| 	http.Handle("/", validatePrefix(fs))
 | |
| 
 | |
| 	// we need to proxy the videopath to somewhere in a standalone binary
 | |
| 	proxyVideoURL()
 | |
| }
 | |
| 
 | |
| type handler struct {
 | |
| 	proxy *httputil.ReverseProxy
 | |
| }
 | |
| 
 | |
| func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 | |
| 	h.proxy.ServeHTTP(w, r)
 | |
| }
 | |
| 
 | |
| func proxyVideoURL() {
 | |
| 	conf := settings.LoadSettings()
 | |
| 
 | |
| 	// match base url
 | |
| 	regexMatchUrl := regexp.MustCompile("^http(|s):\\/\\/([0-9]){1,3}\\.([0-9]){1,3}\\.([0-9]){1,3}\\.([0-9]){1,3}:[0-9]{1,5}")
 | |
| 
 | |
| 	var videoUrl *url.URL
 | |
| 	if regexMatchUrl.MatchString(conf.VideoPath) {
 | |
| 		fmt.Println("matches string...")
 | |
| 		var err error
 | |
| 		videoUrl, err = url.Parse(regexMatchUrl.FindString(conf.VideoPath))
 | |
| 		if err != nil {
 | |
| 			panic(err)
 | |
| 		}
 | |
| 	} else {
 | |
| 		videoUrl, _ = url.Parse("http://127.0.0.1:8081")
 | |
| 	}
 | |
| 
 | |
| 	director := func(req *http.Request) {
 | |
| 		req.URL.Scheme = videoUrl.Scheme
 | |
| 		req.URL.Host = videoUrl.Host
 | |
| 	}
 | |
| 
 | |
| 	serverVideoPath := strings.TrimPrefix(conf.VideoPath, regexMatchUrl.FindString(conf.VideoPath))
 | |
| 
 | |
| 	reverseProxy := &httputil.ReverseProxy{Director: director}
 | |
| 	handler := handler{proxy: reverseProxy}
 | |
| 	http.Handle(serverVideoPath, handler)
 | |
| }
 | |
| 
 | |
| // ValidatePrefix check if requested path is a file -- if not proceed with index.html
 | |
| func validatePrefix(h http.Handler) http.Handler {
 | |
| 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | |
| 		regex := regexp.MustCompile("\\..*$")
 | |
| 		matchFile := regex.MatchString(r.URL.Path)
 | |
| 
 | |
| 		if matchFile {
 | |
| 			h.ServeHTTP(w, r)
 | |
| 		} else {
 | |
| 			r2 := new(http.Request)
 | |
| 			*r2 = *r
 | |
| 			r2.URL = new(url.URL)
 | |
| 			*r2.URL = *r.URL
 | |
| 			r2.URL.Path = "/"
 | |
| 			r2.URL.RawPath = "/"
 | |
| 			h.ServeHTTP(w, r2)
 | |
| 		}
 | |
| 	})
 | |
| }
 |