diff options
Diffstat (limited to 'cmd/receivepack9418/conn.go')
| -rw-r--r-- | cmd/receivepack9418/conn.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/cmd/receivepack9418/conn.go b/cmd/receivepack9418/conn.go new file mode 100644 index 00000000..31062193 --- /dev/null +++ b/cmd/receivepack9418/conn.go @@ -0,0 +1,65 @@ +package main + +import ( + "bufio" + "context" + "fmt" + "log" + "net" + "strings" + + "codeberg.org/lindenii/furgit/receivepack" +) + +func (srv *server) handleConn(conn net.Conn) { + defer func() { _ = conn.Close() }() + + reader := bufio.NewReader(conn) + writer := bufio.NewWriter(conn) + + req, err := readGitProtoRequest(reader) + if err != nil { + writeErrPkt(writer, fmt.Sprintf("invalid initial request: %v", err)) + _ = writer.Flush() + log.Printf("receivepack9418: %s: invalid initial request: %v", conn.RemoteAddr(), err) + return + } + + if req.Command != "git-receive-pack" { + writeErrPkt(writer, fmt.Sprintf("unsupported command %q", req.Command)) + _ = writer.Flush() + log.Printf("receivepack9418: %s: unsupported command %q", conn.RemoteAddr(), req.Command) + return + } + + gitProtocol := strings.Join(req.ExtraParameters, ":") + + opts := receivepack.Options{ + GitProtocol: gitProtocol, + Algorithm: srv.repo.Algorithm(), + Refs: srv.repo.Refs(), + ExistingObjects: srv.repo.Objects(), + ObjectsRoot: srv.objectsRoot, + } + + err = receivepack.ReceivePack(context.Background(), writer, reader, opts) + if err != nil { + _ = writer.Flush() + log.Printf( + "receivepack9418: %s: receive-pack failed (path=%q host=%q extras=%v): %v", + conn.RemoteAddr(), + req.Pathname, + req.Host, + req.ExtraParameters, + err, + ) + + return + } + + err = writer.Flush() + if err != nil { + log.Printf("receivepack9418: %s: flush failed: %v", conn.RemoteAddr(), err) + return + } +} |
