aboutsummaryrefslogtreecommitdiffhomepage
path: root/modules/caddyhttp/fileserver/command.go
diff options
context:
space:
mode:
authorMatthew Holt <[email protected]>2019-10-03 16:00:41 -0600
committerMatthew Holt <[email protected]>2019-10-03 16:00:41 -0600
commitc11e3bffd698cfb1e19a21097ff4a65cf10e28b0 (patch)
tree01eb0f52cd3276669677ea32d1859ff0d1398669 /modules/caddyhttp/fileserver/command.go
parentf29a9eee0d062d7fb975d8779db4ea8a07d26f7d (diff)
downloadcaddy-c11e3bffd698cfb1e19a21097ff4a65cf10e28b0.tar.gz
caddy-c11e3bffd698cfb1e19a21097ff4a65cf10e28b0.zip
Add file-server and reverse-proxy subcommands
Diffstat (limited to 'modules/caddyhttp/fileserver/command.go')
-rw-r--r--modules/caddyhttp/fileserver/command.go106
1 files changed, 106 insertions, 0 deletions
diff --git a/modules/caddyhttp/fileserver/command.go b/modules/caddyhttp/fileserver/command.go
new file mode 100644
index 000000000..727d7baa3
--- /dev/null
+++ b/modules/caddyhttp/fileserver/command.go
@@ -0,0 +1,106 @@
+// Copyright 2015 Matthew Holt and The Caddy Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package fileserver
+
+import (
+ "encoding/json"
+ "flag"
+ "log"
+
+ "github.com/caddyserver/caddy/v2"
+ "github.com/caddyserver/caddy/v2/caddyconfig"
+ caddycmd "github.com/caddyserver/caddy/v2/cmd"
+ "github.com/caddyserver/caddy/v2/modules/caddyhttp"
+)
+
+func init() {
+ caddycmd.RegisterCommand(caddycmd.Command{
+ Name: "file-server",
+ Func: cmdFileServer,
+ Usage: "[--domain <example.com>] [--path <path>] [--listen <addr>] [--browse]",
+ Short: "Spins up a production-ready file server",
+ Long: `
+A simple but production-ready file server. Useful for quick deployments,
+demos, and development.
+
+If a qualifying hostname is specified with --domain, the server will use
+HTTPS if domain validation succeeds. Ensure A/AAAA records are properly
+configured before using this option.
+
+The listener's socket address can be customized with the --listen flag.
+
+If --browse is enabled, requests for folders without an index file will
+respond with a file listing.`,
+ Flags: func() *flag.FlagSet {
+ fs := flag.NewFlagSet("file-server", flag.ExitOnError)
+ fs.String("domain", "", "Domain name at which to serve the files")
+ fs.String("root", "", "The path to the root of the site")
+ fs.String("listen", "", "The address to which to bind the listener")
+ fs.Bool("browse", false, "Whether to enable directory browsing")
+ return fs
+ }(),
+ })
+}
+
+func cmdFileServer(fs caddycmd.Flags) (int, error) {
+ domain := fs.String("domain")
+ root := fs.String("root")
+ listen := fs.String("listen")
+ browse := fs.Bool("browse")
+
+ handler := FileServer{Root: root}
+ if browse {
+ handler.Browse = new(Browse)
+ }
+
+ route := caddyhttp.Route{
+ HandlersRaw: []json.RawMessage{
+ caddyconfig.JSONModuleObject(handler, "handler", "file_server", nil),
+ },
+ }
+ if domain != "" {
+ route.MatcherSetsRaw = []map[string]json.RawMessage{
+ map[string]json.RawMessage{
+ "host": caddyconfig.JSON(caddyhttp.MatchHost{domain}, nil),
+ },
+ }
+ }
+
+ server := &caddyhttp.Server{
+ Routes: caddyhttp.RouteList{route},
+ }
+ if listen != "" {
+ server.Listen = []string{listen}
+ }
+
+ httpApp := caddyhttp.App{
+ Servers: map[string]*caddyhttp.Server{"static": server},
+ }
+
+ cfg := &caddy.Config{
+ AppsRaw: map[string]json.RawMessage{
+ "http": caddyconfig.JSON(httpApp, nil),
+ },
+ }
+
+ err := caddy.Run(cfg)
+ if err != nil {
+ return caddy.ExitCodeFailedStartup, err
+ }
+
+ log.Println("Caddy 2 serving static files")
+
+ select {}
+}