@@ -4,109 +4,12 @@ import (
4
4
"context"
5
5
"flag"
6
6
"fmt"
7
- "log"
8
- "net/http"
9
7
"os"
10
- "os/signal"
11
- "strings"
12
- "sync"
13
- "syscall"
14
8
15
9
"github.com/github/git-bundle-server/cmd/utils"
16
10
"github.com/github/git-bundle-server/internal/argparse"
17
- "github.com/github/git-bundle-server/internal/common"
18
- "github.com/github/git-bundle-server/internal/core"
19
11
)
20
12
21
- func parseRoute (path string ) (string , string , string , error ) {
22
- elements := strings .FieldsFunc (path , func (char rune ) bool { return char == '/' })
23
- switch len (elements ) {
24
- case 0 :
25
- return "" , "" , "" , fmt .Errorf ("empty route" )
26
- case 1 :
27
- return "" , "" , "" , fmt .Errorf ("route has owner, but no repo" )
28
- case 2 :
29
- return elements [0 ], elements [1 ], "" , nil
30
- case 3 :
31
- return elements [0 ], elements [1 ], elements [2 ], nil
32
- default :
33
- return "" , "" , "" , fmt .Errorf ("path has depth exceeding three" )
34
- }
35
- }
36
-
37
- func serve (w http.ResponseWriter , r * http.Request ) {
38
- user , err := common .NewUserProvider ().CurrentUser ()
39
- if err != nil {
40
- return
41
- }
42
- fs := common .NewFileSystem ()
43
- path := r .URL .Path
44
-
45
- owner , repo , file , err := parseRoute (path )
46
- if err != nil {
47
- w .WriteHeader (http .StatusNotFound )
48
- fmt .Printf ("Failed to parse route: %s\n " , err )
49
- return
50
- }
51
-
52
- route := owner + "/" + repo
53
-
54
- repos , err := core .GetRepositories (user , fs )
55
- if err != nil {
56
- w .WriteHeader (http .StatusInternalServerError )
57
- fmt .Printf ("Failed to load routes\n " )
58
- return
59
- }
60
-
61
- repository , contains := repos [route ]
62
- if ! contains {
63
- w .WriteHeader (http .StatusNotFound )
64
- fmt .Printf ("Failed to get route out of repos\n " )
65
- return
66
- }
67
-
68
- if file == "" {
69
- file = "bundle-list"
70
- }
71
-
72
- fileToServe := repository .WebDir + "/" + file
73
- data , err := os .ReadFile (fileToServe )
74
- if err != nil {
75
- w .WriteHeader (http .StatusNotFound )
76
- fmt .Printf ("Failed to read file\n " )
77
- return
78
- }
79
-
80
- fmt .Printf ("Successfully serving content for %s/%s\n " , route , file )
81
- w .Write (data )
82
- }
83
-
84
- func startServer (server * http.Server ,
85
- cert string , key string ,
86
- serverWaitGroup * sync.WaitGroup ,
87
- ) {
88
- // Add to wait group
89
- serverWaitGroup .Add (1 )
90
-
91
- go func () {
92
- defer serverWaitGroup .Done ()
93
-
94
- // Return error unless it indicates graceful shutdown
95
- var err error
96
- if cert != "" {
97
- err = server .ListenAndServeTLS (cert , key )
98
- } else {
99
- err = server .ListenAndServe ()
100
- }
101
-
102
- if err != nil && err != http .ErrServerClosed {
103
- log .Fatal (err )
104
- }
105
- }()
106
-
107
- fmt .Println ("Server is running at address " + server .Addr )
108
- }
109
-
110
13
func main () {
111
14
ctx := context .Background ()
112
15
@@ -124,28 +27,16 @@ func main() {
124
27
key := utils .GetFlagValue [string ](parser , "key" )
125
28
126
29
// Configure the server
127
- mux := http .NewServeMux ()
128
- mux .HandleFunc ("/" , serve )
129
- server := & http.Server {
130
- Handler : mux ,
131
- Addr : ":" + port ,
132
- }
133
- serverWaitGroup := & sync.WaitGroup {}
30
+ bundleServer := NewBundleWebServer (port , cert , key )
134
31
135
32
// Start the server asynchronously
136
- startServer ( server , cert , key , serverWaitGroup )
33
+ bundleServer . StartServerAsync ( ctx )
137
34
138
35
// Intercept interrupt signals
139
- c := make (chan os.Signal , 1 )
140
- signal .Notify (c , os .Interrupt , syscall .SIGINT , syscall .SIGTERM )
141
- go func () {
142
- <- c
143
- fmt .Println ("Starting graceful server shutdown..." )
144
- server .Shutdown (ctx )
145
- }()
36
+ bundleServer .HandleSignalsAsync (ctx )
146
37
147
38
// Wait for server to shut down
148
- serverWaitGroup .Wait ()
39
+ bundleServer .Wait ()
149
40
150
41
fmt .Println ("Shutdown complete" )
151
42
}
0 commit comments