adding ipv6 support because i like ipv6
This commit is contained in:
parent
a7c52fd177
commit
223cc8b60b
2 changed files with 53 additions and 1 deletions
40
net/dualstack.go
Normal file
40
net/dualstack.go
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue