mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-30 22:02:25 -05:00 
			
		
		
		
	Static fileserver improvements, optional admin panel route (#100)
* better asset serving, optional admin panel route * linting
This commit is contained in:
		
					parent
					
						
							
								eef88ae31d
							
						
					
				
			
			
				commit
				
					
						bbc2494c58
					
				
			
		
					 3 changed files with 59 additions and 6 deletions
				
			
		|  | @ -46,6 +46,8 @@ type Router interface { | ||||||
| 	AttachMiddleware(handler gin.HandlerFunc) | 	AttachMiddleware(handler gin.HandlerFunc) | ||||||
| 	// Attach 404 NoRoute handler | 	// Attach 404 NoRoute handler | ||||||
| 	AttachNoRouteHandler(handler gin.HandlerFunc) | 	AttachNoRouteHandler(handler gin.HandlerFunc) | ||||||
|  | 	// Add Gin StaticFile handler | ||||||
|  | 	AttachStaticFS(relativePath string, fs http.FileSystem) | ||||||
| 	// Start the router | 	// Start the router | ||||||
| 	Start() | 	Start() | ||||||
| 	// Stop the router | 	// Stop the router | ||||||
|  | @ -61,6 +63,11 @@ type router struct { | ||||||
| 	certManager *autocert.Manager | 	certManager *autocert.Manager | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Add Gin StaticFile handler | ||||||
|  | func (r *router) AttachStaticFS(relativePath string, fs http.FileSystem) { | ||||||
|  | 	r.engine.StaticFS(relativePath, fs) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Start starts the router nicely. | // Start starts the router nicely. | ||||||
| // | // | ||||||
| // Different ports and handlers will be served depending on whether letsencrypt is enabled or not. | // Different ports and handlers will be served depending on whether letsencrypt is enabled or not. | ||||||
|  |  | ||||||
|  | @ -24,7 +24,6 @@ import ( | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 
 | 
 | ||||||
| 	"github.com/gin-contrib/static" |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"github.com/sirupsen/logrus" | 	"github.com/sirupsen/logrus" | ||||||
| 	"github.com/superseriousbusiness/gotosocial/internal/api" | 	"github.com/superseriousbusiness/gotosocial/internal/api" | ||||||
|  | @ -93,7 +92,11 @@ func (m *Module) Route(s router.Router) error { | ||||||
| 		return fmt.Errorf("error getting current working directory: %s", err) | 		return fmt.Errorf("error getting current working directory: %s", err) | ||||||
| 	} | 	} | ||||||
| 	assetPath := filepath.Join(cwd, m.config.TemplateConfig.AssetBaseDir) | 	assetPath := filepath.Join(cwd, m.config.TemplateConfig.AssetBaseDir) | ||||||
| 	s.AttachMiddleware(static.Serve("/assets", static.LocalFile(assetPath, false))) | 	s.AttachStaticFS("/assets", FileSystem{http.Dir(assetPath)}) | ||||||
|  | 
 | ||||||
|  | 	// Admin panel route, if it exists | ||||||
|  | 	adminPath := filepath.Join(cwd, m.config.TemplateConfig.AssetBaseDir, "/admin") | ||||||
|  | 	s.AttachStaticFS("/admin", FileSystem{http.Dir(adminPath)}) | ||||||
| 
 | 
 | ||||||
| 	// serve front-page | 	// serve front-page | ||||||
| 	s.AttachHandler(http.MethodGet, "/", m.baseHandler) | 	s.AttachHandler(http.MethodGet, "/", m.baseHandler) | ||||||
|  | @ -101,9 +104,5 @@ func (m *Module) Route(s router.Router) error { | ||||||
| 	// 404 handler | 	// 404 handler | ||||||
| 	s.AttachNoRouteHandler(m.NotFoundHandler) | 	s.AttachNoRouteHandler(m.NotFoundHandler) | ||||||
| 
 | 
 | ||||||
| 	if err != nil { |  | ||||||
| 		return fmt.Errorf("error setting router FuncMap: %s", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										47
									
								
								internal/web/fileserver.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								internal/web/fileserver.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | ||||||
|  | /* | ||||||
|  |    GoToSocial | ||||||
|  |    Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org | ||||||
|  | 
 | ||||||
|  |    This program is free software: you can redistribute it and/or modify | ||||||
|  |    it under the terms of the GNU Affero General Public License as published by | ||||||
|  |    the Free Software Foundation, either version 3 of the License, or | ||||||
|  |    (at your option) any later version. | ||||||
|  | 
 | ||||||
|  |    This program is distributed in the hope that it will be useful, | ||||||
|  |    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |    GNU Affero General Public License for more details. | ||||||
|  | 
 | ||||||
|  |    You should have received a copy of the GNU Affero General Public License | ||||||
|  |    along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | package web | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"net/http" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type FileSystem struct { | ||||||
|  | 	fs http.FileSystem | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // FileSystem server that only accepts directory listings when an index.html is available | ||||||
|  | // from https://gist.github.com/hauxe/f2ea1901216177ccf9550a1b8bd59178 | ||||||
|  | func (fs FileSystem) Open(path string) (http.File, error) { | ||||||
|  | 	f, err := fs.fs.Open(path) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	s, _ := f.Stat() | ||||||
|  | 	if s.IsDir() { | ||||||
|  | 		index := strings.TrimSuffix(path, "/") + "/index.html" | ||||||
|  | 		if _, err := fs.fs.Open(index); err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return f, nil | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue