mirror of
				https://github.com/evilsocket/arc.git
				synced 2024-05-26 22:37:37 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			81 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
|  * Arc - Copyleft of Simone 'evilsocket' Margaritelli.
 | |
|  * evilsocket at protonmail dot com
 | |
|  * https://www.evilsocket.net/
 | |
|  *
 | |
|  * See LICENSE.
 | |
|  */
 | |
| package middlewares
 | |
| 
 | |
| // This middleware is a variation of github.com/gin-gonic/contrib/static
 | |
| // created because of this https://github.com/evilsocket/arc/issues/64
 | |
| import (
 | |
| 	// "github.com/evilsocket/islazy/log"
 | |
| 	"github.com/gin-gonic/gin"
 | |
| 	"net/http"
 | |
| 	"os"
 | |
| 	"path"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| type ServeFileSystem interface {
 | |
| 	http.FileSystem
 | |
| 	Exists(prefix string, path string) bool
 | |
| }
 | |
| 
 | |
| type localFileSystem struct {
 | |
| 	http.FileSystem
 | |
| 	root string
 | |
| }
 | |
| 
 | |
| var IndexFile = ""
 | |
| 
 | |
| func Static(root, index string) *localFileSystem {
 | |
| 	IndexFile = index
 | |
| 	if len(IndexFile) > 0 && IndexFile[0] != '/' {
 | |
| 		IndexFile = "/" + IndexFile
 | |
| 	}
 | |
| 
 | |
| 	return &localFileSystem{
 | |
| 		FileSystem: gin.Dir(root, false),
 | |
| 		root:       root,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (l *localFileSystem) Exists(prefix string, filepath string) bool {
 | |
| 	if p := strings.TrimPrefix(filepath, prefix); len(p) < len(filepath) {
 | |
| 		name := path.Join(l.root, p)
 | |
| 		if stats, err := os.Stat(name); err != nil || stats.IsDir() {
 | |
| 			return false
 | |
| 		}
 | |
| 		return true
 | |
| 	}
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| func ServeStatic(url, root, index string) gin.HandlerFunc {
 | |
| 	// log.Debug("Creating static middleware for path %s (index=%s)", tui.Bold(root), index)
 | |
| 	return Serve(url, Static(root, index))
 | |
| }
 | |
| 
 | |
| // Static returns a middleware handler that serves static files in the given directory.
 | |
| func Serve(url string, fs ServeFileSystem) gin.HandlerFunc {
 | |
| 	fileserver := http.FileServer(fs)
 | |
| 	if url != "" {
 | |
| 		fileserver = http.StripPrefix(url, fileserver)
 | |
| 	}
 | |
| 	return func(c *gin.Context) {
 | |
| 		path := c.Request.URL.Path
 | |
| 		// Fixes https://github.com/evilsocket/arc/issues/64
 | |
| 		if path == "/" {
 | |
| 			// log.Debug("Fixing request path / to %s.", tui.Bold(IndexFile))
 | |
| 			path = IndexFile
 | |
| 		}
 | |
| 
 | |
| 		if fs.Exists(url, path) {
 | |
| 			fileserver.ServeHTTP(c.Writer, c.Request)
 | |
| 			c.Abort()
 | |
| 		}
 | |
| 	}
 | |
| }
 | 
