e6d975beebc622204a3c0573dffbcb0672a79905

Author
Akhil Velagapudi <akhilvelagapudi@gmail.com>
Committer
GitHub <noreply@github.com>
Date

Message

feat: improve smart HTTP clone performance (#913)

Diff

 1diff --git a/pkg/web/git.go b/pkg/web/git.go
 2index 6723ac6f093304f413d0753a88fd61244dacc597..5a15ed2eda6e2f29ff156971ba0204fce3c504cb 100644
 3--- a/pkg/web/git.go
 4+++ b/pkg/web/git.go
 5@@ -390,10 +390,8 @@ func serviceRpc(w http.ResponseWriter, r *http.Request) {
 6 
 7 	version := r.Header.Get("Git-Protocol")
 8 
 9-	var stdout bytes.Buffer
10 	cmd := git.ServiceCommand{
11-		Stdout: &stdout,
12-		Dir:    dir,
13+		Dir: dir,
14 	}
15 
16 	switch service {
17@@ -438,7 +436,7 @@ func serviceRpc(w http.ResponseWriter, r *http.Request) {
18 	}
19 
20 	cmd.Stdin = reader
21-	cmd.Stdout = &flushResponseWriter{w}
22+	cmd.Stdout = w
23 
24 	if err := service.Handler(ctx, cmd); err != nil {
25 		logger.Errorf("failed to handle service: %v", err)
26@@ -452,39 +450,6 @@ func serviceRpc(w http.ResponseWriter, r *http.Request) {
27 	}
28 }
29 
30-// Handle buffered output
31-// Useful when using proxies
32-type flushResponseWriter struct {
33-	http.ResponseWriter
34-}
35-
36-func (f *flushResponseWriter) ReadFrom(r io.Reader) (int64, error) {
37-	flusher := http.NewResponseController(f.ResponseWriter)
38-
39-	var n int64
40-	p := make([]byte, 1024)
41-	for {
42-		nRead, err := r.Read(p)
43-		if err == io.EOF {
44-			break
45-		}
46-		nWrite, err := f.ResponseWriter.Write(p[:nRead])
47-		if err != nil {
48-			return n, err
49-		}
50-		if nRead != nWrite {
51-			return n, err
52-		}
53-		n += int64(nRead)
54-		// ResponseWriter must support http.Flusher to handle buffered output.
55-		if err := flusher.Flush(); err != nil {
56-			return n, fmt.Errorf("%w: error while flush", err)
57-		}
58-	}
59-
60-	return n, nil
61-}
62-
63 func getInfoRefs(w http.ResponseWriter, r *http.Request) {
64 	ctx := r.Context()
65 	cfg := config.FromContext(ctx)
66diff --git a/pkg/web/server.go b/pkg/web/server.go
67index 682175150eadff661ac8bc44a28071c2857e2093..8167af260cd7a69fe82b6cb7e69d2b6293c62ce2 100644
68--- a/pkg/web/server.go
69+++ b/pkg/web/server.go
70@@ -27,7 +27,6 @@ func NewRouter(ctx context.Context) http.Handler {
71 	// Adds context to the request
72 	h := NewLoggingMiddleware(router, logger)
73 	h = NewContextHandler(ctx)(h)
74-	h = handlers.CompressHandler(h)
75 	h = handlers.RecoveryHandler()(h)
76 
77 	cfg := config.FromContext(ctx)