@@ -2,6 +2,7 @@ package main
2
2
3
3
import (
4
4
"context"
5
+ "flag"
5
6
"fmt"
6
7
"log"
7
8
"net/http"
@@ -11,34 +12,25 @@ import (
11
12
"sync"
12
13
"syscall"
13
14
15
+ "github.com/github/git-bundle-server/cmd/utils"
16
+ "github.com/github/git-bundle-server/internal/argparse"
14
17
"github.com/github/git-bundle-server/internal/core"
15
18
)
16
19
17
20
func parseRoute (path string ) (string , string , string , error ) {
18
- if len (path ) == 0 {
21
+ elements := strings .FieldsFunc (path , func (char rune ) bool { return char == '/' })
22
+ switch len (elements ) {
23
+ case 0 :
19
24
return "" , "" , "" , fmt .Errorf ("empty route" )
20
- }
21
-
22
- if path [0 ] == '/' {
23
- path = path [1 :]
24
- }
25
-
26
- slash1 := strings .Index (path , "/" )
27
- if slash1 < 0 {
25
+ case 1 :
28
26
return "" , "" , "" , fmt .Errorf ("route has owner, but no repo" )
29
- }
30
- slash2 := strings .Index (path [slash1 + 1 :], "/" )
31
- if slash2 < 0 {
32
- // No trailing slash.
33
- return path [:slash1 ], path [slash1 + 1 :], "" , nil
34
- }
35
- slash2 += slash1 + 1
36
- slash3 := strings .Index (path [slash2 + 1 :], "/" )
37
- if slash3 >= 0 {
27
+ case 2 :
28
+ return elements [0 ], elements [1 ], "" , nil
29
+ case 3 :
30
+ return elements [0 ], elements [1 ], elements [2 ], nil
31
+ default :
38
32
return "" , "" , "" , fmt .Errorf ("path has depth exceeding three" )
39
33
}
40
-
41
- return path [:slash1 ], path [slash1 + 1 : slash2 ], path [slash2 + 1 :], nil
42
34
}
43
35
44
36
func serve (w http.ResponseWriter , r * http.Request ) {
@@ -83,36 +75,57 @@ func serve(w http.ResponseWriter, r *http.Request) {
83
75
w .Write (data )
84
76
}
85
77
86
- func createAndStartServer (address string , serverWaitGroup * sync.WaitGroup ) * http.Server {
87
- // Create the HTTP server
88
- server := & http.Server {Addr : address }
89
-
90
- // API routes
91
- http .HandleFunc ("/" , serve )
92
-
78
+ func startServer (server * http.Server ,
79
+ cert string , key string ,
80
+ serverWaitGroup * sync.WaitGroup ,
81
+ ) {
93
82
// Add to wait group
94
83
serverWaitGroup .Add (1 )
95
84
96
85
go func () {
97
86
defer serverWaitGroup .Done ()
98
87
99
88
// Return error unless it indicates graceful shutdown
100
- err := server .ListenAndServe ()
101
- if err != http .ErrServerClosed {
89
+ var err error
90
+ if cert != "" {
91
+ err = server .ListenAndServeTLS (cert , key )
92
+ } else {
93
+ err = server .ListenAndServe ()
94
+ }
95
+
96
+ if err != nil && err != http .ErrServerClosed {
102
97
log .Fatal (err )
103
98
}
104
99
}()
105
100
106
- fmt .Println ("Server is running at address " + address )
107
- return server
101
+ fmt .Println ("Server is running at address " + server .Addr )
108
102
}
109
103
110
104
func main () {
105
+ parser := argparse .NewArgParser ("git-bundle-web-server [--port <port>] [--cert <filename> --key <filename>]" )
106
+ flags , validate := utils .WebServerFlags (parser )
107
+ flags .VisitAll (func (f * flag.Flag ) {
108
+ parser .Var (f .Value , f .Name , f .Usage )
109
+ })
110
+ parser .Parse (os .Args [1 :])
111
+ validate ()
112
+
113
+ // Get the flag values
114
+ port := utils .GetFlagValue [string ](parser , "port" )
115
+ cert := utils .GetFlagValue [string ](parser , "cert" )
116
+ key := utils .GetFlagValue [string ](parser , "key" )
117
+
118
+ // Configure the server
119
+ mux := http .NewServeMux ()
120
+ mux .HandleFunc ("/" , serve )
121
+ server := & http.Server {
122
+ Handler : mux ,
123
+ Addr : ":" + port ,
124
+ }
111
125
serverWaitGroup := & sync.WaitGroup {}
112
126
113
127
// Start the server asynchronously
114
- port := ":8080"
115
- server := createAndStartServer (port , serverWaitGroup )
128
+ startServer (server , cert , key , serverWaitGroup )
116
129
117
130
// Intercept interrupt signals
118
131
c := make (chan os.Signal , 1 )
0 commit comments