// Copyright 2019 Drone IO, Inc. // // 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. // +build oss package server import ( "context" "net/http" "golang.org/x/sync/errgroup" ) // A Server defines parameters for running an HTTP server. type Server struct { Acme bool Addr string Cert string Key string Host string Handler http.Handler } // ListenAndServe initializes a server to respond to HTTP network requests. func (s Server) ListenAndServe(ctx context.Context) error { if s.Key != "" { return s.listenAndServeTLS(ctx) } return s.listenAndServe(ctx) } func (s Server) listenAndServe(ctx context.Context) error { var g errgroup.Group s1 := &http.Server{ Addr: s.Addr, Handler: s.Handler, } g.Go(func() error { select { case <-ctx.Done(): return s1.Shutdown(ctx) } }) g.Go(func() error { return s1.ListenAndServe() }) return g.Wait() } func (s Server) listenAndServeTLS(ctx context.Context) error { var g errgroup.Group s1 := &http.Server{ Addr: ":http", Handler: s.Handler, } s2 := &http.Server{ Addr: ":https", Handler: s.Handler, } g.Go(func() error { return s1.ListenAndServe() }) g.Go(func() error { return s2.ListenAndServeTLS( s.Cert, s.Key, ) }) g.Go(func() error { select { case <-ctx.Done(): s1.Shutdown(ctx) s2.Shutdown(ctx) return nil } }) return g.Wait() }