arimelody-web/net/dualstack.go

40 lines
881 B
Go

package net
import (
"fmt"
"net"
"net/http"
"sync"
)
type DualStackHTTPServer struct {
Handler http.Handler
}
func (s *DualStackHTTPServer) ListenAndServe(ipv4 string, ipv6 string, port int) error {
v4Listener, err := net.Listen("tcp4", fmt.Sprintf("%s:%d", ipv4, port))
if err != nil {
return fmt.Errorf("IPv4 listen: %v", err)
}
v6Listener, err := net.Listen("tcp6", fmt.Sprintf("[%s]:%d", ipv6, port))
if err != nil {
v4Listener.Close()
return fmt.Errorf("IPv6 listen: %v", err)
}
srv := &http.Server{ Handler: s.Handler }
var wg sync.WaitGroup
errs := make(chan error, 2)
for _, listener := range []net.Listener{v4Listener, v6Listener} {
wg.Add(1)
go func(l net.Listener) {
defer wg.Done()
errs <- srv.Serve(l)
}(listener)
}
return <-errs
}