private static GitRoute GetGitRoute(HttpContext context) { if (!_services.ContainsKey(context.Request.RequestType)) return null; var handlers = _services[context.Request.RequestType]; foreach (var pair in handlers) { Match m = pair.Key.Match(context.Request.Path); if (m.Success) { var route = new GitRoute(); route.Handler = pair.Value; string repo; if (context.Request.ApplicationPath == "/") repo = context.Request.FilePath.Substring(1, context.Request.FilePath.Length - 5); else repo = context.Request.FilePath.Replace(context.Request.ApplicationPath + "/", ""); route.File = context.Request.Path.Replace(m.Groups[1].Value + "/", ""); route.Repository = Repository.Open(new DirectoryInfo(Path.Combine(GitSettings.RepositoriesPath, repo))); route.FilePath = Path.Combine(route.Repository.Directory.FullName, route.File); return route; } } return null; }
private static void SendFile(HttpContext context, GitRoute route, string contentType) { var file = new FileInfo(route.FilePath); context.Response.StatusCode = 200; context.Response.ContentType = contentType; if (!file.Exists) return; context.Response.AddFileDependency(file.FullName); context.Response.WriteFile(file.FullName); }
private static void HandleReceivePackPost(HttpContext context, GitRoute route) { VerifyAccess(context); context.Response.ContentType = "application/x-git-receive-pack-result"; var pack = new ReceivePack(route.Repository); pack.setBiDirectionalPipe(false); pack.receive(context.Request.InputStream, context.Response.OutputStream, context.Response.OutputStream); }
private static void HandleUploadPackPost(HttpContext context, GitRoute route) { context.Response.ContentType = "application/x-git-upload-pack-result"; var pack = new UploadPack(route.Repository); pack.setBiDirectionalPipe(false); pack.Upload(context.Request.InputStream, context.Response.OutputStream, context.Response.OutputStream); }
private static void HandleInfoRefsGet(HttpContext context, GitRoute route) { var gitService = context.Request.QueryString["service"]; if (string.IsNullOrWhiteSpace(gitService) || !gitService.StartsWith("git-")) { SendFile(context, route, "text/plain; charset=utf-8"); } else { var service = gitService.Substring(4); context.Response.ContentType = string.Format("application/x-git-{0}-advertisement", service); context.Response.Write(GitString("# service=git-" + service + "\n")); context.Response.Write("0000"); if (service == "upload-pack") { var pack = new UploadPack(route.Repository); pack.sendAdvertisedRefs(new RefAdvertiser.PacketLineOutRefAdvertiser(new PacketLineOut(context.Response.OutputStream))); } else if (service == "receive-pack") { VerifyAccess(context); var pack = new ReceivePack(route.Repository); pack.SendAdvertisedRefs(new RefAdvertiser.PacketLineOutRefAdvertiser(new PacketLineOut(context.Response.OutputStream))); } } }