summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Mazuruk <a.mazuruk@samsung.com>2018-08-13 17:30:00 +0200
committerAlexander Mazuruk <a.mazuruk@samsung.com>2018-09-13 16:17:07 +0000
commit30c6d5c730671bbae5f0dfb49b89024a76586772 (patch)
tree8ad1f43c5a38082b52c0056eabead351d733d39a
parent492bcd27007b4e54ba996cb49a7697c88e98fc29 (diff)
downloadweles-30c6d5c730671bbae5f0dfb49b89024a76586772.tar.gz
weles-30c6d5c730671bbae5f0dfb49b89024a76586772.tar.bz2
weles-30c6d5c730671bbae5f0dfb49b89024a76586772.zip
Update go-swagger, regenerate server
This resolves bug where out of ArtifactInfo struct only ArtifactDescription was marshalled to JSON: https://github.com/go-swagger/go-swagger/issues/1617 Fixed in 0.16.0 release. 1. Updated Gopkg.toml 2. Re-generated Gopkg.lock $ make Gopkg.lock 3. Build new swagger $ make tools 4. Re-generate swagger server $ make swagger-server-generate Change-Id: I622e4a2500203f4236d8938031abfee136c69b81 Signed-off-by: Alexander Mazuruk <a.mazuruk@samsung.com>
-rw-r--r--Gopkg.lock127
-rw-r--r--Gopkg.toml8
-rw-r--r--artifact_info.go54
-rw-r--r--server/server.go136
4 files changed, 202 insertions, 123 deletions
diff --git a/Gopkg.lock b/Gopkg.lock
index f1eba11..fe6113e 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -28,8 +28,8 @@
[[projects]]
name = "github.com/davecgh/go-spew"
packages = ["spew"]
- revision = "346938d642f2ec3594ed81d874461961cd0faa76"
- version = "v1.1.0"
+ revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73"
+ version = "v1.1.1"
[[projects]]
name = "github.com/dgrijalva/jwt-go"
@@ -57,33 +57,36 @@
[[projects]]
name = "github.com/go-openapi/analysis"
- packages = ["."]
- revision = "3c8fe72ed5d307113ef76c7c3035964d7e4d4b73"
- version = "0.15.0"
+ packages = [
+ ".",
+ "internal"
+ ]
+ revision = "7c1bef8f6d9fa6148ce0d8a0ebf5339a084a6639"
+ version = "0.16.0"
[[projects]]
name = "github.com/go-openapi/errors"
packages = ["."]
revision = "b2b2befaf267d082d779bcef52d682a47c779517"
- version = "0.15.0"
+ version = "0.16.0"
[[projects]]
name = "github.com/go-openapi/inflect"
packages = ["."]
revision = "b1f6470ffb9c552dc105dd869f16e36ba86ba7d0"
- version = "0.15.0"
+ version = "0.16.0"
[[projects]]
name = "github.com/go-openapi/jsonpointer"
packages = ["."]
revision = "3a0015ad55fa9873f41605d3e8f28cd279c32ab2"
- version = "0.15.0"
+ version = "0.16.0"
[[projects]]
name = "github.com/go-openapi/jsonreference"
packages = ["."]
revision = "3fb327e6747da3043567ee86abd02bb6376b6be2"
- version = "0.15.0"
+ version = "0.16.0"
[[projects]]
name = "github.com/go-openapi/loads"
@@ -92,7 +95,7 @@
"fmts"
]
revision = "2a2b323bab96e6b1fdee110e57d959322446e9c9"
- version = "0.15.0"
+ version = "0.16.0"
[[projects]]
name = "github.com/go-openapi/runtime"
@@ -107,36 +110,37 @@
"security"
]
revision = "9a3091f566c0811ef4d54b535179bc0fc484a11f"
- version = "0.15.0"
+ version = "0.16.0"
[[projects]]
name = "github.com/go-openapi/spec"
packages = ["."]
- revision = "bce47c9386f9ecd6b86f450478a80103c3fe1402"
- version = "0.15.0"
+ revision = "384415f06ee238aae1df5caad877de6ceac3a5c4"
+ version = "0.16.0"
[[projects]]
name = "github.com/go-openapi/strfmt"
packages = ["."]
revision = "913ee058e387ac83a67e2d9f13acecdcd5769fc6"
- version = "0.15.0"
+ version = "0.16.0"
[[projects]]
name = "github.com/go-openapi/swag"
packages = ["."]
- revision = "2b0bd4f193d011c203529df626a65d63cb8a79e8"
- version = "0.15.0"
+ revision = "becd2f08beafcca035645a8a101e0e3e18140458"
+ version = "0.16.0"
[[projects]]
name = "github.com/go-openapi/validate"
packages = ["."]
- revision = "9a6e517cddf1ddd47449be5d06a6a786e51d9986"
- version = "0.15.0"
+ revision = "7c1911976134d3a24d0c03127505163c9f16aa3b"
+ version = "0.16.0"
[[projects]]
name = "github.com/go-swagger/go-swagger"
packages = ["."]
- revision = "8c101dc8c12c8e25b5803a6376b7b2b7f09a622f"
+ revision = "dd867fd63c30269ac217004c102f47a1774d4f5a"
+ version = "0.16.0"
[[projects]]
branch = "master"
@@ -157,17 +161,16 @@
[[projects]]
name = "github.com/golang/protobuf"
packages = ["proto"]
- revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265"
- version = "v1.1.0"
+ revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5"
+ version = "v1.2.0"
[[projects]]
name = "github.com/gorilla/handlers"
packages = ["."]
- revision = "90663712d74cb411cbef281bc1e08c19d1a76145"
- version = "v1.3.0"
+ revision = "7e0847f9db758cdebd26c149d0ae9d5d0b9c98ce"
+ version = "v1.4.0"
[[projects]]
- branch = "master"
name = "github.com/hashicorp/hcl"
packages = [
".",
@@ -181,7 +184,20 @@
"json/scanner",
"json/token"
]
- revision = "ef8a98b0bbce4a65b5aa4c368430a80ddc533168"
+ revision = "8cb6e5b959231cc1119e43259c4a608f9c51a241"
+ version = "v1.0.0"
+
+[[projects]]
+ name = "github.com/hpcloud/tail"
+ packages = [
+ ".",
+ "ratelimiter",
+ "util",
+ "watch",
+ "winfile"
+ ]
+ revision = "a30252cb686a21eb2d0b98132633053ec2f7f1e5"
+ version = "v1.0.0"
[[projects]]
name = "github.com/jessevdk/go-flags"
@@ -215,7 +231,7 @@
"jlexer",
"jwriter"
]
- revision = "3fdea8d05856a0c8df22ed4bc71b3219245e4485"
+ revision = "60711f1a8329503b04e1c88535f419d0bb440bff"
[[projects]]
name = "github.com/mattn/go-sqlite3"
@@ -224,10 +240,10 @@
version = "v1.9.0"
[[projects]]
- branch = "master"
name = "github.com/mitchellh/mapstructure"
packages = ["."]
- revision = "bb74f1db0675b241733089d5a1faa5dd8b0ef57b"
+ revision = "fa473d140ef3c6adf42d6b391fe76707f1f243c8"
+ version = "v1.0.0"
[[projects]]
name = "github.com/onsi/ginkgo"
@@ -252,8 +268,8 @@
"reporters/stenographer/support/go-isatty",
"types"
]
- revision = "fa5fabab2a1bfbd924faf4c067d07ae414e2aedf"
- version = "v1.5.0"
+ revision = "3774a09d95489ccaa16032e0770d08ea77ba6184"
+ version = "v1.6.0"
[[projects]]
name = "github.com/onsi/gomega"
@@ -271,8 +287,8 @@
"matchers/support/goraph/util",
"types"
]
- revision = "62bff4df71bdbc266561a0caee19f0594b17c240"
- version = "v1.4.0"
+ revision = "b6ea1ea48f981d0f615a154a45eabb9dd466556d"
+ version = "v1.4.1"
[[projects]]
name = "github.com/pelletier/go-toml"
@@ -295,8 +311,8 @@
".",
"mem"
]
- revision = "787d034dfe70e44075ccc060d346146ef53270ad"
- version = "v1.1.1"
+ revision = "d40851caa0d747393da1ffb28f7f9d8b4eeffebd"
+ version = "v1.1.2"
[[projects]]
name = "github.com/spf13/cast"
@@ -305,22 +321,22 @@
version = "v1.2.0"
[[projects]]
- branch = "master"
name = "github.com/spf13/jwalterweatherman"
packages = ["."]
- revision = "7c0cea34c8ece3fbeb2b27ab9b59511d360fb394"
+ revision = "4a4406e478ca629068e7768fc33f3f044173c0a6"
+ version = "v1.0.0"
[[projects]]
name = "github.com/spf13/pflag"
packages = ["."]
- revision = "583c0c0531f06d5278b7d917446061adc344b5cd"
- version = "v1.0.1"
+ revision = "9a97c102cda95a86cec2345a6f09f55a939babf5"
+ version = "v1.0.2"
[[projects]]
name = "github.com/spf13/viper"
packages = ["."]
- revision = "b5e8006cbee93ec955a89ab31e0e3ce3204f3736"
- version = "v1.0.2"
+ revision = "8fb642006536c8d3760c99d4fa2389f5e2205631"
+ version = "v1.2.0"
[[projects]]
name = "github.com/tideland/golib"
@@ -349,10 +365,11 @@
"ed25519/internal/edwards25519",
"internal/chacha20",
"internal/subtle",
+ "pbkdf2",
"poly1305",
"ssh"
]
- revision = "a49355c7e3f8fe157a85be2f77e6e269a0f89602"
+ revision = "0e37d006457bf46f9e6692014ba72ef82c33022c"
[[projects]]
branch = "master"
@@ -366,7 +383,7 @@
"idna",
"netutil"
]
- revision = "d0887baf81f4598189d4e12a37c6da86f0bba4d0"
+ revision = "161cd47e91fd58ac17490ef4d742dc98bb4cf60e"
[[projects]]
branch = "master"
@@ -375,13 +392,13 @@
".",
"internal"
]
- revision = "ef147856a6ddbb60760db74283d2424e98c87bff"
+ revision = "d2e6202438beef2727060aa7cabdd924d92ebfd9"
[[projects]]
branch = "master"
name = "golang.org/x/sys"
packages = ["unix"]
- revision = "1b2967e3c290b7c545b3db0deeda16e9be4f98a2"
+ revision = "d0be0721c37eeb5299f245a996a483160fc36940"
[[projects]]
name = "golang.org/x/text"
@@ -423,11 +440,12 @@
packages = [
"go/ast/astutil",
"go/buildutil",
+ "go/internal/cgo",
"go/loader",
"imports",
"internal/fastwalk"
]
- revision = "18e9dfbf20567d5156dd6f1dd987092c021f7fa6"
+ revision = "677d2ff680c188ddb7dcd2bfa6bc7d3f2f2f75b2"
[[projects]]
name = "google.golang.org/appengine"
@@ -444,6 +462,13 @@
version = "v1.1.0"
[[projects]]
+ name = "gopkg.in/fsnotify.v1"
+ packages = ["."]
+ revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9"
+ source = "https://github.com/fsnotify/fsnotify/archive/v1.4.7.tar.gz"
+ version = "v1.4.7"
+
+[[projects]]
branch = "v2"
name = "gopkg.in/mgo.v2"
packages = [
@@ -459,8 +484,14 @@
"cipher",
"json"
]
- revision = "76dd09796242edb5b897103a75df2645c028c960"
- version = "v2.1.6"
+ revision = "8254d6c783765f38c8675fae4427a1fe73fbd09d"
+ version = "v2.1.8"
+
+[[projects]]
+ branch = "v1"
+ name = "gopkg.in/tomb.v1"
+ packages = ["."]
+ revision = "dd632973f1e7218eb1089048e0798ec9ae7dceb8"
[[projects]]
name = "gopkg.in/yaml.v2"
@@ -471,6 +502,6 @@
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
- inputs-digest = "a5e864a9f1537b8cb1a6fdceb4224e969cec77a4e1f692f62b019f7f640638b5"
+ inputs-digest = "060e0f81e4cb9e825489af1b1d729a679af8fb014e3e19864dbd1b017f26923c"
solver-name = "gps-cdcl"
solver-version = 1
diff --git a/Gopkg.toml b/Gopkg.toml
index e46920b..323bd71 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -49,7 +49,13 @@ version = "v1.1.1"
# in other required packages (which do not have stable version tagged)
[[constraint]]
name = "github.com/go-swagger/go-swagger"
-revision = "8c101dc8c12c8e25b5803a6376b7b2b7f09a622f"
+version = "v0.16.0"
+
+
+# https://github.com/golang/dep/issues/1799
+[[override]]
+name = "gopkg.in/fsnotify.v1"
+source = "https://github.com/fsnotify/fsnotify/archive/v1.4.7.tar.gz"
# WARNING!
# Do not uncomment below lines
diff --git a/artifact_info.go b/artifact_info.go
index ae5079c..2881773 100644
--- a/artifact_info.go
+++ b/artifact_info.go
@@ -1,5 +1,4 @@
// Code generated by go-swagger; DO NOT EDIT.
-// NOTE: above is not entirely true. see TODO: below.
// Copyright (c) 2017-2018 Samsung Electronics Co., Ltd All Rights Reserved
//
@@ -34,7 +33,7 @@ import (
type ArtifactInfo struct {
ArtifactDescription
- // ID in the artifacts database
+ // unique identification of the artifact.
ID int64 `json:"ID,omitempty" db:",primarykey, autoincrement"`
// path
@@ -48,12 +47,6 @@ type ArtifactInfo struct {
Timestamp strfmt.DateTime `json:"Timestamp,omitempty"`
}
-// TODO
-// current go-swagger generates broken marshalling and unmarshalling:
-// https://github.com/go-swagger/go-swagger/issues/1617
-// it is commented out as implicit marshalling works fine.
-
-/*
// UnmarshalJSON unmarshals this object from a JSON structure
func (m *ArtifactInfo) UnmarshalJSON(raw []byte) error {
// AO0
@@ -63,6 +56,27 @@ func (m *ArtifactInfo) UnmarshalJSON(raw []byte) error {
}
m.ArtifactDescription = aO0
+ // now for regular properties
+ var propsArtifactInfo struct {
+ ID int64 `json:"ID,omitempty"`
+
+ Path ArtifactPath `json:"Path,omitempty"`
+
+ Status ArtifactStatus `json:"Status,omitempty"`
+
+ Timestamp strfmt.DateTime `json:"Timestamp,omitempty"`
+ }
+ if err := swag.ReadJSON(raw, &propsArtifactInfo); err != nil {
+ return err
+ }
+ m.ID = propsArtifactInfo.ID
+
+ m.Path = propsArtifactInfo.Path
+
+ m.Status = propsArtifactInfo.Status
+
+ m.Timestamp = propsArtifactInfo.Timestamp
+
return nil
}
@@ -76,9 +90,31 @@ func (m ArtifactInfo) MarshalJSON() ([]byte, error) {
}
_parts = append(_parts, aO0)
+ // now for regular properties
+ var propsArtifactInfo struct {
+ ID int64 `json:"ID,omitempty"`
+
+ Path ArtifactPath `json:"Path,omitempty"`
+
+ Status ArtifactStatus `json:"Status,omitempty"`
+
+ Timestamp strfmt.DateTime `json:"Timestamp,omitempty"`
+ }
+ propsArtifactInfo.ID = m.ID
+
+ propsArtifactInfo.Path = m.Path
+
+ propsArtifactInfo.Status = m.Status
+
+ propsArtifactInfo.Timestamp = m.Timestamp
+
+ jsonDataPropsArtifactInfo, errArtifactInfo := swag.WriteJSON(propsArtifactInfo)
+ if errArtifactInfo != nil {
+ return nil, errArtifactInfo
+ }
+ _parts = append(_parts, jsonDataPropsArtifactInfo)
return swag.ConcatJSON(_parts...), nil
}
-*/
// Validate validates this artifact info
func (m *ArtifactInfo) Validate(formats strfmt.Registry) error {
diff --git a/server/server.go b/server/server.go
index 25a265b..dd146aa 100644
--- a/server/server.go
+++ b/server/server.go
@@ -100,9 +100,9 @@ func init() {
flag.StringVar(&tlsHost, "tls-host", "localhost", "the IP to listen on")
flag.IntVar(&tlsPort, "tls-port", 0, "the port to listen on for secure connections, defaults to a random value")
- flag.StringVar(&tlsCertificate, "tls-certificate", "", "the certificate to use for secure connections")
- flag.StringVar(&tlsCertificateKey, "tls-key", "", "the private key to use for secure conections")
- flag.StringVar(&tlsCACertificate, "tls-ca", "", "the certificate authority file to be used with mutual tls auth")
+ flag.StringVar(&tlsCertificate, "tls-certificate", "", "the certificate file to use for secure connections")
+ flag.StringVar(&tlsCertificateKey, "tls-key", "", "the private key file to use for secure connections (without passphrase)")
+ flag.StringVar(&tlsCACertificate, "tls-ca", "", "the certificate authority certificate file to be used with mutual tls auth")
flag.IntVar(&tlsListenLimit, "tls-listen-limit", 0, "limit the number of outstanding requests")
flag.DurationVar(&tlsKeepAlive, "tls-keep-alive", 3*time.Minute, "sets the TCP keep-alive timeouts on accepted connections. It prunes dead TCP connections ( e.g. closing laptop mid-download)")
flag.DurationVar(&tlsReadTimeout, "tls-read-timeout", 30*time.Second, "maximum duration before timing out read of the request")
@@ -283,11 +283,14 @@ func (s *Server) Serve() (err error) {
s.SetHandler(s.api.Serve(nil))
}
- var wg sync.WaitGroup
- quitting := make(chan struct{})
+ wg := new(sync.WaitGroup)
once := new(sync.Once)
signalNotify(s.interrupt)
- go handleInterrupt(once, s, quitting)
+ go handleInterrupt(once, s)
+
+ servers := []*http.Server{}
+ wg.Add(1)
+ go s.handleShutdown(wg, &servers)
if s.hasScheme(schemeUnix) {
domainSocket := new(http.Server)
@@ -299,16 +302,16 @@ func (s *Server) Serve() (err error) {
configureServer(domainSocket, "unix", string(s.SocketPath))
- wg.Add(2)
+ wg.Add(1)
s.Logf("Serving weles at unix://%s", s.SocketPath)
go func(l net.Listener) {
defer wg.Done()
- if err := domainSocket.Serve(l); err != nil {
+ if err := domainSocket.Serve(l); err != nil && err != http.ErrServerClosed {
s.Fatalf("%v", err)
}
s.Logf("Stopped serving weles at unix://%s", s.SocketPath)
}(s.domainSocketL)
- go s.handleShutdown(&wg, domainSocket)
+ servers = append(servers, domainSocket)
}
if s.hasScheme(schemeHTTP) {
@@ -329,16 +332,16 @@ func (s *Server) Serve() (err error) {
configureServer(httpServer, "http", s.httpServerL.Addr().String())
- wg.Add(2)
+ wg.Add(1)
s.Logf("Serving weles at http://%s", s.httpServerL.Addr())
go func(l net.Listener) {
defer wg.Done()
- if err := httpServer.Serve(l); err != nil {
+ if err := httpServer.Serve(l); err != nil && err != http.ErrServerClosed {
s.Fatalf("%v", err)
}
s.Logf("Stopped serving weles at http://%s", l.Addr())
}(s.httpServerL)
- go s.handleShutdown(&wg, httpServer)
+ servers = append(servers, httpServer)
}
if s.hasScheme(schemeHTTPS) {
@@ -373,33 +376,40 @@ func (s *Server) Serve() (err error) {
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+ tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
+ tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
},
}
+ // build standard config from server options
if s.TLSCertificate != "" && s.TLSCertificateKey != "" {
httpsServer.TLSConfig.Certificates = make([]tls.Certificate, 1)
httpsServer.TLSConfig.Certificates[0], err = tls.LoadX509KeyPair(s.TLSCertificate, s.TLSCertificateKey)
+ if err != nil {
+ return err
+ }
}
if s.TLSCACertificate != "" {
+ // include specified CA certificate
caCert, caCertErr := ioutil.ReadFile(s.TLSCACertificate)
if caCertErr != nil {
- log.Fatal(caCertErr)
+ return caCertErr
}
caCertPool := x509.NewCertPool()
- caCertPool.AppendCertsFromPEM(caCert)
+ ok := caCertPool.AppendCertsFromPEM(caCert)
+ if !ok {
+ return fmt.Errorf("cannot parse CA certificate")
+ }
httpsServer.TLSConfig.ClientCAs = caCertPool
httpsServer.TLSConfig.ClientAuth = tls.RequireAndVerifyClientCert
}
+ // call custom TLS configurator
configureTLS(httpsServer.TLSConfig)
- httpsServer.TLSConfig.BuildNameToCertificate()
-
- if err != nil {
- return err
- }
if len(httpsServer.TLSConfig.Certificates) == 0 {
+ // after standard and custom config are passed, this ends up with no certificate
if s.TLSCertificate == "" {
if s.TLSCertificateKey == "" {
s.Fatalf("the required flags `--tls-certificate` and `--tls-key` were not specified")
@@ -409,20 +419,25 @@ func (s *Server) Serve() (err error) {
if s.TLSCertificateKey == "" {
s.Fatalf("the required flag `--tls-key` was not specified")
}
+ // this happens with a wrong custom TLS configurator
+ s.Fatalf("no certificate was configured for TLS")
}
+ // must have at least one certificate or panics
+ httpsServer.TLSConfig.BuildNameToCertificate()
+
configureServer(httpsServer, "https", s.httpsServerL.Addr().String())
- wg.Add(2)
+ wg.Add(1)
s.Logf("Serving weles at https://%s", s.httpsServerL.Addr())
go func(l net.Listener) {
defer wg.Done()
- if err := httpsServer.Serve(l); err != nil {
+ if err := httpsServer.Serve(l); err != nil && err != http.ErrServerClosed {
s.Fatalf("%v", err)
}
s.Logf("Stopped serving weles at https://%s", l.Addr())
}(tls.NewListener(s.httpsServerL, httpsServer.TLSConfig))
- go s.handleShutdown(&wg, httpsServer)
+ servers = append(servers, httpsServer)
}
wg.Wait()
@@ -502,48 +517,49 @@ func (s *Server) Listen() error {
// Shutdown server and clean up resources
func (s *Server) Shutdown() error {
- if atomic.LoadInt32(&s.shuttingDown) != 0 {
- s.Logf("already shutting down")
- return nil
+ if atomic.CompareAndSwapInt32(&s.shuttingDown, 0, 1) {
+ close(s.shutdown)
}
- close(s.shutdown)
return nil
}
-func (s *Server) handleShutdown(wg *sync.WaitGroup, server *http.Server) {
+func (s *Server) handleShutdown(wg *sync.WaitGroup, serversPtr *[]*http.Server) {
+ // wg.Done must occur last, after s.api.ServerShutdown()
+ // (to preserve old behaviour)
defer wg.Done()
+
+ <-s.shutdown
+
+ servers := *serversPtr
+
ctx, cancel := context.WithTimeout(context.TODO(), 15*time.Second)
defer cancel()
- <-s.shutdown
- if err := server.Shutdown(ctx); err != nil {
- // Error from closing listeners, or context timeout:
- s.Logf("HTTP server Shutdown: %v", err)
- } else {
- atomic.AddInt32(&s.shuttingDown, 1)
- select {
- case <-ctx.Done():
- if err := ctx.Err(); err != nil {
- s.Logf("Error %s", err)
- }
- default:
- done := make(chan error)
- defer close(done)
- go func() {
- <-ctx.Done()
- done <- ctx.Err()
- }()
- go func() {
- //done <- s.api.Shutdown(ctx)
- s.api.ServerShutdown()
- done <- errors.New("API shut down")
+ shutdownChan := make(chan bool)
+ for i := range servers {
+ server := servers[i]
+ go func() {
+ var success bool
+ defer func() {
+ shutdownChan <- success
}()
- if err := <-done; err != nil {
- s.Logf("Error %s", err)
+ if err := server.Shutdown(ctx); err != nil {
+ // Error from closing listeners, or context timeout:
+ s.Logf("HTTP server Shutdown: %v", err)
+ } else {
+ success = true
}
- }
+ }()
+ }
+
+ // Wait until all listeners have successfully shut down before calling ServerShutdown
+ success := true
+ for range servers {
+ success = success && <-shutdownChan
+ }
+ if success {
+ s.api.ServerShutdown()
}
- return
}
// GetHandler returns a handler useful for testing
@@ -586,7 +602,7 @@ func (s *Server) TLSListener() (net.Listener, error) {
return s.httpsServerL, nil
}
-func handleInterrupt(once *sync.Once, s *Server, quitting chan struct{}) {
+func handleInterrupt(once *sync.Once, s *Server) {
once.Do(func() {
for _ = range s.interrupt {
if s.interrupted {
@@ -595,17 +611,7 @@ func handleInterrupt(once *sync.Once, s *Server, quitting chan struct{}) {
}
s.interrupted = true
s.Logf("Shutting down... ")
- close(quitting)
-
- if err := s.httpServerL.Close(); err != nil {
- s.Logf("Error: %s", err)
- }
- if err := s.httpsServerL.Close(); err != nil {
- s.Logf("Error: %s", err)
- }
- if err := s.domainSocketL.Close(); err != nil {
- s.Logf("Error: %s", err)
- }
+ s.Shutdown()
}
})
}