github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/api/transports.go (about) 1 package api 2 3 import ( 4 "fmt" 5 "net" 6 "net/http" 7 "time" 8 9 ma "github.com/multiformats/go-multiaddr" 10 manet "github.com/multiformats/go-multiaddr/net" 11 "github.com/qri-io/qri/config" 12 ) 13 14 // StartServer interprets info from config to start an API server 15 func StartServer(c *config.API, s *http.Server) error { 16 if !c.Enabled { 17 return nil 18 } 19 20 addr, err := ma.NewMultiaddr(c.Address) 21 if err != nil { 22 return err 23 } 24 25 var listener net.Listener 26 27 if !c.ServeRemoteTraffic { 28 // if we're not serving remote traffic, strip off any address details other 29 // than a raw TCP address 30 portAddr := config.DefaultAPIPort 31 ma.ForEach(addr, func(comp ma.Component) bool { 32 if comp.Protocol().Code == ma.P_TCP { 33 portAddr = comp.Value() 34 return false 35 } 36 return true 37 }) 38 39 // use a raw listener on a local TCP socket 40 listener, err = net.Listen("tcp", fmt.Sprintf(":%s", portAddr)) 41 if err != nil { 42 return err 43 } 44 } else { 45 mal, err := manet.Listen(addr) 46 if err != nil { 47 return err 48 } 49 listener = manet.NetListener(mal) 50 } 51 52 return s.Serve(listener) 53 } 54 55 // HTTPSRedirect listens over TCP on addr, redirecting HTTP requests to https 56 func HTTPSRedirect(addr string) { 57 ln, err := net.Listen("tcp", addr) 58 if err != nil { 59 return 60 } 61 62 log.Infof("TCP Port %s is available, redirecting traffic to https", addr) 63 64 srv := &http.Server{ 65 ReadTimeout: 5 * time.Second, 66 WriteTimeout: 5 * time.Second, 67 Handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { 68 w.Header().Set("Connection", "close") 69 url := "https://" + req.Host + req.URL.String() 70 http.Redirect(w, req, url, http.StatusMovedPermanently) 71 }), 72 } 73 srv.Serve(ln) 74 }