Skip to content

Commit c35a6c0

Browse files
committed
Using net.Listen to look for open ports before binding them with Gin
Signed-off-by: Andrea Tosatto <andrea.tosy@gmail.com>
1 parent 4ad1c58 commit c35a6c0

File tree

1 file changed

+41
-32
lines changed

1 file changed

+41
-32
lines changed

main.go

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
package main
55

66
import (
7+
"errors"
78
"flag"
9+
"net"
810
"os"
911
"os/user"
1012
"path/filepath"
@@ -75,6 +77,21 @@ func launchSelfLater() {
7577
log.Println("Done waiting 2 secs. Now launching...")
7678
}
7779

80+
// getBindPort returns the first bindable port in the given range
81+
func getBindPort(minPort, maxPort int) (int, error) {
82+
83+
for i := minPort; i < maxPort; i++ {
84+
ln, _ := net.Listen("tcp", ":"+strconv.Itoa(i))
85+
if ln != nil {
86+
ln.Close()
87+
return i, nil
88+
}
89+
}
90+
91+
return -1, errors.New("Unable to bind any port in the range [" + strconv.Itoa(minPort) + "," + strconv.Itoa(maxPort) + ")")
92+
93+
}
94+
7895
func main() {
7996

8097
flag.Parse()
@@ -215,11 +232,18 @@ func main() {
215232

216233
socketHandler := wsHandler().ServeHTTP
217234

218-
extraOriginStr := "https://create.arduino.cc, http://create.arduino.cc, https://create-dev.arduino.cc, http://create-dev.arduino.cc, http://create-staging.arduino.cc, https://create-staging.arduino.cc"
219-
220-
for i := 8990; i < 9001; i++ {
221-
extraOriginStr = extraOriginStr + ", http://localhost:" + strconv.Itoa(i) + ", https://localhost:" + strconv.Itoa(i)
235+
portPlain, err := getBindPort(8990, 9001)
236+
if err != nil {
237+
panic(err)
222238
}
239+
portSSL, err := getBindPort(portPlain+1, 9001)
240+
if err != nil {
241+
panic(err)
242+
}
243+
244+
extraOriginStr := "https://create.arduino.cc, http://create.arduino.cc, https://create-dev.arduino.cc, http://create-dev.arduino.cc, http://create-staging.arduino.cc, https://create-staging.arduino.cc"
245+
extraOriginStr += ", http://localhost:" + strconv.Itoa(portPlain) + ", https://localhost:" + strconv.Itoa(portPlain)
246+
extraOriginStr += ", http://localhost:" + strconv.Itoa(portSSL) + ", https://localhost:" + strconv.Itoa(portSSL)
223247

224248
r.Use(cors.Middleware(cors.Config{
225249
Origins: *origins + ", " + extraOriginStr,
@@ -247,38 +271,23 @@ func main() {
247271
return
248272
}
249273

250-
start := 8990
251-
end := 9000
252-
i := start
253-
for i < end {
254-
i = i + 1
255-
portSSL = ":" + strconv.Itoa(i)
256-
if err := r.RunTLS(portSSL, filepath.Join(dest, "cert.pem"), filepath.Join(dest, "key.pem")); err != nil {
257-
log.Printf("Error trying to bind to port: %v, so exiting...", err)
258-
continue
259-
} else {
260-
ip := "0.0.0.0"
261-
log.Print("Starting server and websocket (SSL) on " + ip + "" + port)
262-
break
263-
}
274+
portStr := ":" + strconv.Itoa(portSSL)
275+
if err := r.RunTLS(portStr, filepath.Join(dest, "cert.pem"), filepath.Join(dest, "key.pem")); err != nil {
276+
log.Printf("Error trying to bind to port: %v, so exiting...", err)
277+
} else {
278+
ip := "0.0.0.0"
279+
log.Print("Starting server and websocket (SSL) on " + ip + "" + port)
264280
}
265281
}()
266282

267283
go func() {
268-
start := 8990
269-
end := 9000
270-
i := start
271-
for i < end {
272-
i = i + 1
273-
port = ":" + strconv.Itoa(i)
274-
if err := r.Run(port); err != nil {
275-
log.Printf("Error trying to bind to port: %v, so exiting...", err)
276-
continue
277-
} else {
278-
ip := "0.0.0.0"
279-
log.Print("Starting server and websocket on " + ip + "" + port)
280-
break
281-
}
284+
285+
portStr := ":" + strconv.Itoa(portPlain)
286+
if err := r.Run(portStr); err != nil {
287+
log.Printf("Error trying to bind to port: %v, so exiting...", err)
288+
} else {
289+
ip := "0.0.0.0"
290+
log.Print("Starting server and websocket on " + ip + "" + port)
282291
}
283292
}()
284293

0 commit comments

Comments
 (0)