// Start serving the blog. func run() { var ( faviconPath = filepath.Join(PublicDir, "favicon.ico") faviconCache = 2 * 24 * time.Hour ) h := handlers.FaviconHandler( handlers.PanicHandler( handlers.LogHandler( handlers.GZIPHandler( http.FileServer(http.Dir(PublicDir)), nil), handlers.NewLogOptions(nil, handlers.Ldefault)), nil), faviconPath, faviconCache) // Assign the combined handler to the server. http.Handle("/", h) // Start it up. log.Printf("trofaf server listening on port %d", Options.Port) if err := http.ListenAndServe(fmt.Sprintf(":%d", Options.Port), nil); err != nil { log.Fatal("FATAL ", err) } }
func main() { rand.Seed(time.Now().UTC().UnixNano()) r := mux.NewRouter() r.PathPrefix("/scripts/").Methods("GET").Handler(http.FileServer(http.Dir("./static/"))) r.PathPrefix("/styles/").Methods("GET").Handler(http.FileServer(http.Dir("./static/"))) r.PathPrefix("/images/").Methods("GET").Handler(http.FileServer(http.Dir("./static/"))) r.PathPrefix("/fonts/").Methods("GET").Handler(http.FileServer(http.Dir("./static/"))) r.PathPrefix("/ico/").Methods("GET").Handler(http.FileServer(http.Dir("./static/"))) r.PathPrefix("/favicon.ico").Methods("GET").Handler(http.FileServer(http.Dir("./static/"))) r.PathPrefix("/robots.txt").Methods("GET").Handler(http.FileServer(http.Dir("./static/"))) r.HandleFunc("/({files:.*}).zip", zipHandler).Methods("GET") r.HandleFunc("/({files:.*}).tar", tarHandler).Methods("GET") r.HandleFunc("/({files:.*}).tar.gz", tarGzHandler).Methods("GET") r.HandleFunc("/download/{token}/{filename}", getHandler).Methods("GET") r.HandleFunc("/{token}/{filename}", previewHandler).MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) (match bool) { match = false // The file will show a preview page when opening the link in browser directly or // from external link. If the referer url path and current path are the same it will be // downloaded. if !acceptsHtml(r.Header) { return false } match = (r.Referer() == "") u, err := url.Parse(r.Referer()) if err != nil { log.Fatal(err) return } match = match || (u.Path != r.URL.Path) return }).Methods("GET") r.HandleFunc("/{token}/{filename}", getHandler).Methods("GET") r.HandleFunc("/get/{token}/{filename}", getHandler).Methods("GET") r.HandleFunc("/put/{filename}", putHandler).Methods("PUT") r.HandleFunc("/upload/{filename}", putHandler).Methods("PUT") r.HandleFunc("/{filename}", putHandler).Methods("PUT") r.HandleFunc("/health.html", healthHandler).Methods("GET") r.HandleFunc("/", postHandler).Methods("POST") // r.HandleFunc("/{page}", viewHandler).Methods("GET") r.HandleFunc("/", viewHandler).Methods("GET") r.NotFoundHandler = http.HandlerFunc(notFoundHandler) port := flag.String("port", "8080", "port number, default: 8080") temp := flag.String("temp", config.Temp, "") basedir := flag.String("basedir", "", "") logpath := flag.String("log", "", "") provider := flag.String("provider", "s3", "") flag.Parse() if *logpath != "" { f, err := os.OpenFile(*logpath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf("error opening file: %v", err) } defer f.Close() log.SetOutput(f) } config.Temp = *temp var err error switch *provider { case "local": if *basedir == "" { log.Panic("basedir not set") } storage, err = NewLocalStorage(*basedir) } if err != nil { log.Panic("Error while creating storage.", err) } mime.AddExtensionType(".md", "text/x-markdown") mime.AddExtensionType(".mkv", "video/webm") log.Printf("Transfer.sh server started. :\nlistening on port: %v\nusing temp folder: %s\nusing storage provider: %s", *port, config.Temp, *provider) log.Printf("---------------------------") s := &http.Server{ Addr: fmt.Sprintf(":%s", *port), Handler: handlers.PanicHandler(LoveHandler(RedirectHandler(handlers.LogHandler(r, handlers.NewLogOptions(log.Printf, "_default_")))), nil), } log.Panic(s.ListenAndServe()) log.Printf("Server stopped.") }
// Prepare the web server and kick it off. func main() { // Blank the default logger's prefixes log.SetFlags(0) // Compile the dynamic templates (native Go templates and Amber // templates are both registered via the for-side-effects-only imports) err := templates.CompileDir("./templates/") if err != nil { panic(err) } // Set the simple routes for static files mux := pat.New() mux.Get("/", handlers.StaticFileHandler("./index.html")) mux.Get("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./public/")))) // Set the more complex routes for session handling and dynamic page (same // handler is used for both GET and POST). ssnOpts := handlers.NewSessionOptions(memStore, secret) ssnOpts.CookieTemplate.MaxAge = sessionExpiration hSsn := handlers.SessionHandler( handlers.ContextHandlerFunc( handlers.GhostHandlerFunc(sessionPageRenderer), 1), ssnOpts) mux.Get("/session", hSsn) mux.Post("/session", hSsn) hAuthSsn := handlers.BasicAuthHandler(hSsn, authenticate, "") mux.Get("/session/auth", hAuthSsn) mux.Post("/session/auth", hAuthSsn) // Set the handler for the chained context route mux.Get("/context", handlers.ContextHandler(handlers.ChainHandlerFuncs( handlers.GhostHandlerFunc(setContext), handlers.GhostHandlerFunc(renderContextPage)), 1)) // Set the panic route, which simply panics mux.Get("/panic", http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { panic("explicit panic") })) // Combine the top level handlers, that wrap around the muxer. // Panic is the outermost, so that any panic is caught and responded to with a code 500. // Log is next, so that every request is logged along with the URL, status code and response time. // GZIP is then applied, so that content is compressed. // Finally, the muxer finds the specific handler that applies to the route. h := handlers.FaviconHandler( handlers.PanicHandler( handlers.LogHandler( handlers.GZIPHandler( mux, nil), handlers.NewLogOptions(nil, handlers.Ltiny)), nil), "./public/favicon.ico", 48*time.Hour) // Assign the combined handler to the server. http.Handle("/", h) // Start it up. if err := http.ListenAndServe(":9000", nil); err != nil { panic(err) } }