@@ -25,33 +25,33 @@ var (
25
25
getIdxFile = regexp .MustCompile ("(.*?)/objects/pack/pack-[0-9a-f]{40}\\ .idx$" )
26
26
)
27
27
28
- type gitHTTPTransferOptions struct {
29
- uploadPack bool
28
+ type options struct {
29
+ uploadPack bool
30
30
receivePack bool
31
- dumbProto bool
31
+ dumbProto bool
32
32
}
33
33
34
- type GitHTTPTransferOption func (* gitHTTPTransferOptions )
34
+ type Option func (* options )
35
35
36
- func WithoutUploadPack () GitHTTPTransferOption {
37
- return func (o * gitHTTPTransferOptions ) {
36
+ func WithoutUploadPack () Option {
37
+ return func (o * options ) {
38
38
o .uploadPack = false
39
39
}
40
40
}
41
41
42
- func WithoutReceivePack () GitHTTPTransferOption {
43
- return func (o * gitHTTPTransferOptions ) {
42
+ func WithoutReceivePack () Option {
43
+ return func (o * options ) {
44
44
o .receivePack = false
45
45
}
46
46
}
47
47
48
- func WithoutDumbProto () GitHTTPTransferOption {
49
- return func (o * gitHTTPTransferOptions ) {
48
+ func WithoutDumbProto () Option {
49
+ return func (o * options ) {
50
50
o .dumbProto = false
51
51
}
52
52
}
53
53
54
- func New (gitRootPath , gitBinPath string , opts ... GitHTTPTransferOption ) (* GitHTTPTransfer , error ) {
54
+ func New (gitRootPath , gitBinPath string , opts ... Option ) (* GitHTTPTransfer , error ) {
55
55
56
56
if gitRootPath == "" {
57
57
cwd , err := os .Getwd ()
@@ -61,7 +61,7 @@ func New(gitRootPath, gitBinPath string, opts ...GitHTTPTransferOption) (*GitHTT
61
61
gitRootPath = cwd
62
62
}
63
63
64
- ghtOpts := & gitHTTPTransferOptions {true , true , true }
64
+ ghtOpts := & options {true , true , true }
65
65
66
66
for _ , opt := range opts {
67
67
opt (ghtOpts )
@@ -109,28 +109,14 @@ func (ght *GitHTTPTransfer) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
109
109
110
110
ctx := NewContext (rw , r , repoPath , filePath )
111
111
112
- if err := ght .Event .emit (AfterMatchRouting , ctx ); err != nil {
113
- RenderInternalServerError (ctx .Response ().Writer )
114
- return
115
- }
112
+ ght .Event .emit (AfterMatchRouting , ctx )
116
113
117
114
if ! ght .Git .Exists (ctx .RepoPath ()) {
118
115
RenderNotFound (ctx .Response ().Writer )
119
116
return
120
117
}
121
118
122
- if err := handler (ctx ); err != nil {
123
- if os .IsNotExist (err ) {
124
- RenderNotFound (ctx .Response ().Writer )
125
- return
126
- }
127
- switch err .(type ) {
128
- case * NoAccessError :
129
- RenderNoAccess (ctx .Response ().Writer )
130
- return
131
- }
132
- RenderInternalServerError (ctx .Response ().Writer )
133
- }
119
+ handler (ctx )
134
120
}
135
121
136
122
func (ght * GitHTTPTransfer ) matchRouting (method , path string ) (repoPath string , filePath string , handler HandlerFunc , err error ) {
@@ -144,11 +130,11 @@ func (ght *GitHTTPTransfer) matchRouting(method, path string) (repoPath string,
144
130
}
145
131
146
132
const (
147
- uploadPack string = "upload-pack"
148
- receivePack string = "receive-pack"
133
+ uploadPack = "upload-pack"
134
+ receivePack = "receive-pack"
149
135
)
150
136
151
- type HandlerFunc func (ctx Context ) error
137
+ type HandlerFunc func (ctx Context )
152
138
153
139
func newEvent () * event {
154
140
return & event {map [EventKey ]HandlerFunc {}}
@@ -166,38 +152,34 @@ type event struct {
166
152
listeners map [EventKey ]HandlerFunc
167
153
}
168
154
169
- func (e * event ) emit (evt EventKey , ctx Context ) error {
155
+ func (e * event ) emit (evt EventKey , ctx Context ) {
170
156
v , ok := e .listeners [evt ]
171
157
if ok {
172
- return v (ctx )
158
+ v (ctx )
173
159
}
174
- return nil
175
160
}
176
161
177
162
func (e * event ) On (evt EventKey , listener HandlerFunc ) {
178
163
e .listeners [evt ] = listener
179
164
}
180
165
181
- func (ght * GitHTTPTransfer ) serviceRPCUpload (ctx Context ) error {
182
- if err := ght .Event .emit (PrepareServiceRPCUpload , ctx ); err != nil {
183
- return err
184
- }
185
- return ght .serviceRPC (ctx , uploadPack )
166
+ func (ght * GitHTTPTransfer ) serviceRPCUpload (ctx Context ) {
167
+ ght .Event .emit (PrepareServiceRPCUpload , ctx )
168
+ ght .serviceRPC (ctx , uploadPack )
186
169
}
187
170
188
- func (ght * GitHTTPTransfer ) serviceRPCReceive (ctx Context ) error {
189
- if err := ght .Event .emit (PrepareServiceRPCReceive , ctx ); err != nil {
190
- return err
191
- }
192
- return ght .serviceRPC (ctx , receivePack )
171
+ func (ght * GitHTTPTransfer ) serviceRPCReceive (ctx Context ) {
172
+ ght .Event .emit (PrepareServiceRPCReceive , ctx )
173
+ ght .serviceRPC (ctx , receivePack )
193
174
}
194
175
195
- func (ght * GitHTTPTransfer ) serviceRPC (ctx Context , rpc string ) error {
176
+ func (ght * GitHTTPTransfer ) serviceRPC (ctx Context , rpc string ) {
196
177
197
178
res , req , repoPath := ctx .Response (), ctx .Request (), ctx .RepoPath ()
198
179
199
180
if ! ght .Git .HasAccess (req , rpc , true ) {
200
- return & NoAccessError {Dir : ght .Git .GetAbsolutePath (repoPath )}
181
+ RenderNoAccess (ctx .Response ().Writer )
182
+ return
201
183
}
202
184
203
185
var body io.ReadCloser
@@ -206,7 +188,8 @@ func (ght *GitHTTPTransfer) serviceRPC(ctx Context, rpc string) error {
206
188
if req .Header .Get ("Content-Encoding" ) == "gzip" {
207
189
body , err = gzip .NewReader (req .Body )
208
190
if err != nil {
209
- return err
191
+ RenderInternalServerError (ctx .Response ().Writer )
192
+ return
210
193
}
211
194
} else {
212
195
body = req .Body
@@ -220,17 +203,19 @@ func (ght *GitHTTPTransfer) serviceRPC(ctx Context, rpc string) error {
220
203
221
204
stdin , err := cmd .StdinPipe ()
222
205
if err != nil {
223
- return err
206
+ RenderInternalServerError (ctx .Response ().Writer )
207
+ return
224
208
}
225
209
226
210
stdout , err := cmd .StdoutPipe ()
227
211
if err != nil {
228
- return err
212
+ RenderInternalServerError (ctx .Response ().Writer )
213
+ return
229
214
}
230
215
231
- err = cmd .Start () // could be merged in one statement
232
- if err != nil {
233
- return err
216
+ if err = cmd .Start (); err != nil {
217
+ RenderInternalServerError ( ctx . Response (). Writer )
218
+ return
234
219
}
235
220
236
221
var wg sync.WaitGroup
@@ -250,23 +235,28 @@ func (ght *GitHTTPTransfer) serviceRPC(ctx Context, rpc string) error {
250
235
251
236
wg .Wait ()
252
237
253
- return cmd .Wait ()
254
-
238
+ if err = cmd .Wait (); err != nil {
239
+ RenderInternalServerError (ctx .Response ().Writer )
240
+ return
241
+ }
255
242
}
256
243
257
- func (ght * GitHTTPTransfer ) getInfoRefs (ctx Context ) error {
244
+ func (ght * GitHTTPTransfer ) getInfoRefs (ctx Context ) {
258
245
res , req , repoPath := ctx .Response (), ctx .Request (), ctx .RepoPath ()
259
246
260
247
serviceName := getServiceType (req )
261
248
if ! ght .Git .HasAccess (req , serviceName , false ) {
262
249
ght .Git .UpdateServerInfo (repoPath )
263
250
res .HdrNocache ()
264
- return ght .sendFile ("text/plain; charset=utf-8" , ctx )
251
+ if err := ght .sendFile ("text/plain; charset=utf-8" , ctx ); err != nil {
252
+ RenderNotFound (ctx .Response ().Writer )
253
+ }
265
254
}
266
255
267
256
refs , err := ght .Git .GetInfoRefs (repoPath , serviceName )
268
257
if err != nil {
269
- return err
258
+ RenderNotFound (ctx .Response ().Writer )
259
+ return
270
260
}
271
261
272
262
res .HdrNocache ()
@@ -275,33 +265,42 @@ func (ght *GitHTTPTransfer) getInfoRefs(ctx Context) error {
275
265
res .PktWrite ("# service=git-" + serviceName + "\n " )
276
266
res .PktFlush ()
277
267
res .Write (refs )
278
-
279
- return nil
280
268
}
281
269
282
- func (ght * GitHTTPTransfer ) getInfoPacks (ctx Context ) error {
270
+ func (ght * GitHTTPTransfer ) getInfoPacks (ctx Context ) {
283
271
ctx .Response ().HdrCacheForever ()
284
- return ght .sendFile ("text/plain; charset=utf-8" , ctx )
272
+ if err := ght .sendFile ("text/plain; charset=utf-8" , ctx ); err != nil {
273
+ RenderNotFound (ctx .Response ().Writer )
274
+ }
285
275
}
286
276
287
- func (ght * GitHTTPTransfer ) getLooseObject (ctx Context ) error {
277
+ func (ght * GitHTTPTransfer ) getLooseObject (ctx Context ) {
288
278
ctx .Response ().HdrCacheForever ()
289
- return ght .sendFile ("application/x-git-loose-object" , ctx )
279
+ if err := ght .sendFile ("application/x-git-loose-object" , ctx ); err != nil {
280
+ RenderNotFound (ctx .Response ().Writer )
281
+ }
290
282
}
291
283
292
- func (ght * GitHTTPTransfer ) getPackFile (ctx Context ) error {
284
+ func (ght * GitHTTPTransfer ) getPackFile (ctx Context ) {
293
285
ctx .Response ().HdrCacheForever ()
294
- return ght .sendFile ("application/x-git-packed-objects" , ctx )
286
+ if err := ght .sendFile ("application/x-git-packed-objects" , ctx ); err != nil {
287
+ RenderNotFound (ctx .Response ().Writer )
288
+ }
289
+
295
290
}
296
291
297
- func (ght * GitHTTPTransfer ) getIdxFile (ctx Context ) error {
292
+ func (ght * GitHTTPTransfer ) getIdxFile (ctx Context ) {
298
293
ctx .Response ().HdrCacheForever ()
299
- return ght .sendFile ("application/x-git-packed-objects-toc" , ctx )
294
+ if err := ght .sendFile ("application/x-git-packed-objects-toc" , ctx ); err != nil {
295
+ RenderNotFound (ctx .Response ().Writer )
296
+ }
300
297
}
301
298
302
- func (ght * GitHTTPTransfer ) getTextFile (ctx Context ) error {
299
+ func (ght * GitHTTPTransfer ) getTextFile (ctx Context ) {
303
300
ctx .Response ().HdrNocache ()
304
- return ght .sendFile ("text/plain" , ctx )
301
+ if err := ght .sendFile ("text/plain" , ctx ); err != nil {
302
+ RenderNotFound (ctx .Response ().Writer )
303
+ }
305
304
}
306
305
307
306
func (ght * GitHTTPTransfer ) sendFile (contentType string , ctx Context ) error {
@@ -314,6 +313,5 @@ func (ght *GitHTTPTransfer) sendFile(contentType string, ctx Context) error {
314
313
res .SetContentLength (fmt .Sprintf ("%d" , fileInfo .Size ()))
315
314
res .SetLastModified (fileInfo .ModTime ().Format (http .TimeFormat ))
316
315
http .ServeFile (res .Writer , req , fileInfo .AbsolutePath )
317
-
318
316
return nil
319
317
}
0 commit comments