コード例 #1
0
        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;
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 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);
 }
コード例 #4
0
 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);
 }
コード例 #5
0
        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)));
                }
            }
        }