aboutsummaryrefslogtreecommitdiff
path: root/packages/server/src/git/http.ts
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2021-07-23 14:02:57 +0200
committerHampusM <hampus@hampusmat.com>2021-07-23 14:02:57 +0200
commit22e44b4ef5f74f7058c01ade82ce14aaf9214f18 (patch)
tree2f24834b6d45af6f0c94357eafef5523b797d0cd /packages/server/src/git/http.ts
parent998d566194cf901a2c927851f9b87c8b577d21a9 (diff)
Cleaned and improved the backend
Put the initial Fastify stuff into a dedicated file, organized the types & made several improvements in the git http backend
Diffstat (limited to 'packages/server/src/git/http.ts')
-rw-r--r--packages/server/src/git/http.ts40
1 files changed, 22 insertions, 18 deletions
diff --git a/packages/server/src/git/http.ts b/packages/server/src/git/http.ts
index 2d707cb..66d296c 100644
--- a/packages/server/src/git/http.ts
+++ b/packages/server/src/git/http.ts
@@ -1,18 +1,16 @@
import { FastifyReply, FastifyRequest } from "fastify";
-import { IncomingMessage } from "http";
import { Repository } from "./repository";
-import { Route } from "../fastify_types";
+import { Route } from "../types/fastify";
import { join } from "path";
import { spawn } from "child_process";
import { verifyGitRequest } from "../api/util";
export type RequestInfo = {
- repo: string,
url_path: string,
parsed_url: URL,
url_path_parts: string[],
is_discovery: boolean,
- service: string | null,
+ service: string,
content_type: string
}
@@ -20,21 +18,21 @@ export interface Request extends FastifyRequest {
params: Route["Params"],
}
-function getRequestInfo(req: Request): RequestInfo {
- const repo = req.params.repo + ".git";
- const url_path = req.url.replace(req.params.repo, repo);
+function getRequestInfo(req: Request, repository_name: string): RequestInfo {
+ const url_path = req.url.replace(req.params.repo, repository_name);
const parsed_url = new URL(`${req.protocol}://${req.hostname}${url_path}`);
const url_path_parts = parsed_url.pathname.split("/");
const is_discovery = (/\/info\/refs$/u).test(parsed_url.pathname);
- const service = is_discovery ? parsed_url.searchParams.get("service") : url_path_parts[url_path_parts.length - 1];
+ let service = is_discovery ? parsed_url.searchParams.get("service") : url_path_parts[url_path_parts.length - 1];
const content_type = `application/x-${service}-${is_discovery ? "advertisement" : "result"}`;
+ service = service || "";
+
return {
- repo,
url_path,
parsed_url,
is_discovery,
@@ -45,7 +43,7 @@ function getRequestInfo(req: Request): RequestInfo {
}
export function connect(repository: Repository, req: Request, reply: FastifyReply): void {
- const request_info = getRequestInfo(req);
+ const request_info = getRequestInfo(req, repository.name.short);
const valid_request = verifyGitRequest(request_info);
if(valid_request.success === false && valid_request.code) {
@@ -56,12 +54,12 @@ export function connect(repository: Repository, req: Request, reply: FastifyRepl
reply.raw.writeHead(200, { "Content-Type": request_info.content_type });
- const spawn_args = [ "--stateless-rpc", join(repository.base_dir, request_info.repo) ];
+ const spawn_args = [ "--stateless-rpc", join(repository.base_dir, repository.name.full) ];
if(request_info.is_discovery) {
spawn_args.push("--advertise-refs");
}
- const git_pack = spawn(<string>request_info.service, spawn_args);
+ const git_pack = spawn(request_info.service, spawn_args);
if(request_info.is_discovery) {
const s = "# service=" + request_info.service + "\n";
@@ -69,16 +67,22 @@ export function connect(repository: Repository, req: Request, reply: FastifyRepl
reply.raw.write(Buffer.from((Array(4 - n.length + 1).join("0") + n + s) + "0000"));
}
else {
- const request_body: IncomingMessage = req.raw;
-
- request_body.on("data", data => git_pack.stdin.write(data));
- request_body.on("close", () => git_pack.stdin.end());
+ const request_body = req.raw;
+
+ request_body.on("data", data => {
+ git_pack.stdin.write(data);
+ });
+ request_body.on("end", () => {
+ git_pack.stdin.end();
+ });
}
git_pack.on("error", err => console.log(err));
git_pack.stderr.on("data", (stderr: Buffer) => console.log(stderr.toString()));
- git_pack.stdout.on("data", data => reply.raw.write(data));
+ git_pack.stdout.on("data", data => {
+ reply.raw.write(data);
+ });
- git_pack.on("close", () => reply.raw.end());
+ git_pack.stdout.on("end", () => reply.raw.end());
} \ No newline at end of file