@@ -10,6 +10,8 @@ import (
10
10
"net/url"
11
11
"os"
12
12
"os/signal"
13
+ "strconv"
14
+ "strings"
13
15
"syscall"
14
16
"time"
15
17
@@ -171,8 +173,19 @@ func (s *Server) ApplyToServer() error {
171
173
return nil
172
174
}
173
175
174
- func (s * Server ) Start () error {
175
- addr := fmt .Sprintf ("%s:%d" , s .ServerConfig .BindAddress , s .ServerConfig .Port )
176
+ func (s * Server ) Start (ctx context.Context ) error {
177
+ var addrs []string
178
+ if s .ServerConfig .BindAddress == "" {
179
+ addrs = append (addrs , ":" + strconv .Itoa (s .ServerConfig .Port ))
180
+ } else {
181
+ for _ , addr := range strings .Split (s .ServerConfig .BindAddress , "," ) {
182
+ if ip := net .ParseIP (addr ); ip != nil && ip .To4 () == nil {
183
+ addr = "[" + addr + "]"
184
+ }
185
+ addrs = append (addrs , addr + ":" + strconv .Itoa (s .ServerConfig .Port ))
186
+ }
187
+ }
188
+
176
189
handler := s .Container ()
177
190
178
191
connState := func (conn net.Conn , state http.ConnState ) {
@@ -194,7 +207,6 @@ func (s *Server) Start() error {
194
207
}
195
208
196
209
if s .ServerConfig .TLSCertFile != "" && s .ServerConfig .TLSKeyFile != "" {
197
-
198
210
cert , err := tls .LoadX509KeyPair (s .ServerConfig .TLSCertFile , s .ServerConfig .TLSKeyFile )
199
211
if err != nil {
200
212
return err
@@ -212,15 +224,31 @@ func (s *Server) Start() error {
212
224
MinVersion : tls .VersionTLS12 ,
213
225
Certificates : []tls.Certificate {cert },
214
226
}
227
+ for _ , addr := range addrs {
228
+ go func (addr string ) {
229
+ listener , err := tls .Listen ("tcp" , addr , & config )
230
+ if err != nil {
231
+ logger .Fatal (fmt .Sprintf ("failed to listen %s, err: %v" , addr , err ), zap .String ("func" , "Start" ))
232
+ return
233
+ }
215
234
216
- listener , err := tls .Listen ("tcp" , addr , & config )
217
- if err != nil {
218
- return err
235
+ srv := http.Server {Handler : handler , ConnState : connState }
236
+ if err := srv .Serve (listener ); err != nil {
237
+ logger .Fatal (fmt .Sprintf ("failed to serve at %s, err: %v" , addr , err ), zap .String ("func" , "Start" ))
238
+ }
239
+ }(addr )
240
+ }
241
+ } else {
242
+ for _ , addr := range addrs {
243
+ go func (addr string ) {
244
+ srv := http.Server {Addr : addr , Handler : handler , ConnState : connState }
245
+ if err := srv .ListenAndServe (); err != nil {
246
+ logger .Fatal (fmt .Sprintf ("failed to listen and serve at %s, err: %v" , addr , err ), zap .String ("func" , "Start" ))
247
+ }
248
+ }(addr )
219
249
}
220
-
221
- srv := http.Server {Handler : handler , ConnState : connState }
222
- return srv .Serve (listener )
223
250
}
224
- srv := http.Server {Addr : addr , Handler : handler , ConnState : connState }
225
- return srv .ListenAndServe ()
251
+
252
+ <- ctx .Done ()
253
+ return nil
226
254
}
0 commit comments