4
4
package main
5
5
6
6
import (
7
+ "errors"
7
8
"flag"
9
+ "net"
8
10
"os"
9
11
"os/user"
10
12
"path/filepath"
@@ -14,9 +16,9 @@ import (
14
16
"time"
15
17
16
18
log "github.com/Sirupsen/logrus"
19
+ "github.com/itsjamie/gin-cors"
17
20
"github.com/carlescere/scheduler"
18
21
"github.com/gin-gonic/gin"
19
- "github.com/itsjamie/gin-cors"
20
22
"github.com/kardianos/osext"
21
23
"github.com/vharitonsky/iniflags"
22
24
//"github.com/sanbornm/go-selfupdate/selfupdate" #included in update.go to change heavily
@@ -75,6 +77,21 @@ func launchSelfLater() {
75
77
log .Println ("Done waiting 2 secs. Now launching..." )
76
78
}
77
79
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
+
78
95
func main () {
79
96
80
97
flag .Parse ()
@@ -215,12 +232,23 @@ func main() {
215
232
216
233
socketHandler := wsHandler ().ServeHTTP
217
234
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 )
238
+ }
239
+ // All the ports p in the range 8990 <= p <= portPlain
240
+ // has already been scanned and results not free.
241
+ // Thus we can restrict the search range for portSSL
242
+ // to [portPlain+1, 9001).
243
+ portSSL , err := getBindPort (portPlain + 1 , 9001 )
244
+ if err != nil {
245
+ panic (err )
222
246
}
223
247
248
+ 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"
249
+ extraOriginStr += ", http://localhost:" + strconv .Itoa (portPlain ) + ", https://localhost:" + strconv .Itoa (portPlain )
250
+ extraOriginStr += ", http://localhost:" + strconv .Itoa (portSSL ) + ", https://localhost:" + strconv .Itoa (portSSL )
251
+
224
252
r .Use (cors .Middleware (cors.Config {
225
253
Origins : * origins + ", " + extraOriginStr ,
226
254
Methods : "GET, PUT, POST, DELETE" ,
@@ -247,38 +275,23 @@ func main() {
247
275
return
248
276
}
249
277
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
- }
278
+ portStr := ":" + strconv .Itoa (portSSL )
279
+ if err := r .RunTLS (portStr , filepath .Join (dest , "cert.pem" ), filepath .Join (dest , "key.pem" )); err != nil {
280
+ log .Printf ("Error trying to bind to port: %v, so exiting..." , err )
281
+ } else {
282
+ ip := "0.0.0.0"
283
+ log .Print ("Starting server and websocket (SSL) on " + ip + "" + port )
264
284
}
265
285
}()
266
286
267
287
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
- }
288
+
289
+ portStr := ":" + strconv .Itoa (portPlain )
290
+ if err := r .Run (portStr ); err != nil {
291
+ log .Printf ("Error trying to bind to port: %v, so exiting..." , err )
292
+ } else {
293
+ ip := "0.0.0.0"
294
+ log .Print ("Starting server and websocket on " + ip + "" + port )
282
295
}
283
296
}()
284
297
0 commit comments