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  }