Skip to content

Commit

Permalink
Merge pull request containers#10546 from boaz0/closes_8645
Browse files Browse the repository at this point in the history
Add CORS support
  • Loading branch information
openshift-merge-robot authored Jun 4, 2021
2 parents c361a38 + 2810c47 commit cdf26a3
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 12 deletions.
11 changes: 7 additions & 4 deletions cmd/podman/system/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ Enable a listening service for API access to Podman commands.
}

srvArgs = struct {
Timeout int64
Timeout int64
CorsHeaders string
}{}
)

Expand All @@ -54,6 +55,8 @@ func init() {
timeFlagName := "time"
flags.Int64VarP(&srvArgs.Timeout, timeFlagName, "t", 5, "Time until the service session expires in seconds. Use 0 to disable the timeout")
_ = srvCmd.RegisterFlagCompletionFunc(timeFlagName, completion.AutocompleteNone)
flags.StringVarP(&srvArgs.CorsHeaders, "cors", "", "", "Set CORS Headers")
_ = srvCmd.RegisterFlagCompletionFunc("cors", completion.AutocompleteNone)

flags.SetNormalizeFunc(aliasTimeoutFlag)
}
Expand All @@ -71,7 +74,6 @@ func service(cmd *cobra.Command, args []string) error {
return err
}
logrus.Infof("using API endpoint: '%s'", apiURI)

// Clean up any old existing unix domain socket
if len(apiURI) > 0 {
uri, err := url.Parse(apiURI)
Expand All @@ -90,8 +92,9 @@ func service(cmd *cobra.Command, args []string) error {
}

opts := entities.ServiceOptions{
URI: apiURI,
Command: cmd,
URI: apiURI,
Command: cmd,
CorsHeaders: srvArgs.CorsHeaders,
}

opts.Timeout = time.Duration(srvArgs.Timeout) * time.Second
Expand Down
2 changes: 1 addition & 1 deletion cmd/podman/system/service_abi.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ func restService(opts entities.ServiceOptions, flags *pflag.FlagSet, cfg *entiti
}

infra.StartWatcher(rt)
server, err := api.NewServerWithSettings(rt, opts.Timeout, listener)
server, err := api.NewServerWithSettings(rt, listener, api.Options{Timeout: opts.Timeout, CorsHeaders: opts.CorsHeaders})
if err != nil {
return err
}
Expand Down
4 changes: 4 additions & 0 deletions docs/source/markdown/podman-system-service.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ Note: The default systemd unit files (system and user) change the log-level opti
The time until the session expires in _seconds_. The default is 5
seconds. A value of `0` means no timeout, therefore the session will not expire.

#### **--cors**

CORS headers to inject to the HTTP response. The default value is empty string which disables CORS headers.

#### **--help**, **-h**

Print usage statement.
Expand Down
6 changes: 6 additions & 0 deletions pkg/api/server/handler_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ func (s *APIServer) APIHandler(h http.HandlerFunc) http.HandlerFunc {
w.Header().Set("Libpod-API-Version", lv)
w.Header().Set("Server", "Libpod/"+lv+" ("+runtime.GOOS+")")

if s.CorsHeaders != "" {
w.Header().Set("Access-Control-Allow-Origin", s.CorsHeaders)
w.Header().Set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, X-Registry-Auth, Connection, Upgrade, X-Registry-Config")
w.Header().Set("Access-Control-Allow-Methods", "HEAD, GET, POST, DELETE, PUT, OPTIONS")
}

h(w, r)
logrus.Debugf("APIHandler(%s) -- %s %s END", rid, r.Method, r.URL.String())
}
Expand Down
21 changes: 17 additions & 4 deletions pkg/api/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,28 +34,35 @@ type APIServer struct {
context.CancelFunc // Stop APIServer
idleTracker *idle.Tracker // Track connections to support idle shutdown
pprof *http.Server // Sidecar http server for providing performance data
CorsHeaders string // Inject CORS headers to each request
}

// Number of seconds to wait for next request, if exceeded shutdown server
const (
DefaultCorsHeaders = ""
DefaultServiceDuration = 300 * time.Second
UnlimitedServiceDuration = 0 * time.Second
)

// shutdownOnce ensures Shutdown() may safely be called from several go routines
var shutdownOnce sync.Once

type Options struct {
Timeout time.Duration
CorsHeaders string
}

// NewServer will create and configure a new API server with all defaults
func NewServer(runtime *libpod.Runtime) (*APIServer, error) {
return newServer(runtime, DefaultServiceDuration, nil)
return newServer(runtime, DefaultServiceDuration, nil, DefaultCorsHeaders)
}

// NewServerWithSettings will create and configure a new API server using provided settings
func NewServerWithSettings(runtime *libpod.Runtime, duration time.Duration, listener *net.Listener) (*APIServer, error) {
return newServer(runtime, duration, listener)
func NewServerWithSettings(runtime *libpod.Runtime, listener *net.Listener, opts Options) (*APIServer, error) {
return newServer(runtime, opts.Timeout, listener, opts.CorsHeaders)
}

func newServer(runtime *libpod.Runtime, duration time.Duration, listener *net.Listener) (*APIServer, error) {
func newServer(runtime *libpod.Runtime, duration time.Duration, listener *net.Listener, corsHeaders string) (*APIServer, error) {
// If listener not provided try socket activation protocol
if listener == nil {
if _, found := os.LookupEnv("LISTEN_PID"); !found {
Expand All @@ -71,6 +78,11 @@ func newServer(runtime *libpod.Runtime, duration time.Duration, listener *net.Li
}
listener = &listeners[0]
}
if corsHeaders == "" {
logrus.Debug("CORS Headers were not set")
} else {
logrus.Debugf("CORS Headers were set to %s", corsHeaders)
}

logrus.Infof("API server listening on %q", (*listener).Addr())
router := mux.NewRouter().UseEncodedPath()
Expand All @@ -88,6 +100,7 @@ func newServer(runtime *libpod.Runtime, duration time.Duration, listener *net.Li
idleTracker: idle,
Listener: *listener,
Runtime: runtime,
CorsHeaders: corsHeaders,
}

router.NotFoundHandler = http.HandlerFunc(
Expand Down
7 changes: 4 additions & 3 deletions pkg/domain/entities/system.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ import (

// ServiceOptions provides the input for starting an API Service
type ServiceOptions struct {
URI string // Path to unix domain socket service should listen on
Timeout time.Duration // duration of inactivity the service should wait before shutting down
Command *cobra.Command // CLI command provided. Used in V1 code
URI string // Path to unix domain socket service should listen on
Timeout time.Duration // duration of inactivity the service should wait before shutting down
Command *cobra.Command // CLI command provided. Used in V1 code
CorsHeaders string // CORS headers
}

// SystemPruneOptions provides options to prune system.
Expand Down

0 comments on commit cdf26a3

Please sign in to comment.