Пример #1
0
        protected override Task<HttpResponseMessage> CreateDirectoryGetResponse(DirectoryInfo info, string localFilePath)
        {
            HttpResponseMessage response = Request.CreateResponse();
            using (var ms = new MemoryStream())
            {
                using (var zip = new ZipArchive(ms, ZipArchiveMode.Create, leaveOpen: true))
                {
                    foreach (FileSystemInfo fileSysInfo in info.EnumerateFileSystemInfos())
                    {
                        DirectoryInfo directoryInfo = fileSysInfo as DirectoryInfo;
                        if (directoryInfo != null)
                        {
                            zip.AddDirectory(new DirectoryInfoWrapper(directoryInfo), fileSysInfo.Name);
                        }
                        else
                        {
                            // Add it at the root of the zip
                            zip.AddFile(fileSysInfo.FullName, String.Empty);
                        }
                    }
                }
                response.Content = ms.AsContent();
            }

            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");

            // Name the zip after the folder. e.g. "c:\foo\bar\" --> "bar"
            response.Content.Headers.ContentDisposition.FileName = Path.GetFileName(Path.GetDirectoryName(localFilePath)) + ".zip";
            return Task.FromResult(response);
        }
Пример #2
0
        protected override Task<HttpResponseMessage> CreateDirectoryGetResponse(DirectoryInfo info, string localFilePath)
        {
            HttpResponseMessage response = Request.CreateResponse();
            using (var zip = new ZipFile())
            {
                foreach (FileSystemInfo fileSysInfo in info.EnumerateFileSystemInfos())
                {
                    bool isDirectory = (fileSysInfo.Attributes & FileAttributes.Directory) != 0;

                    if (isDirectory)
                    {
                        zip.AddDirectory(fileSysInfo.FullName, fileSysInfo.Name);
                    }
                    else
                    {
                        // Add it at the root of the zip
                        zip.AddFile(fileSysInfo.FullName, "/");
                    }
                }

                using (var ms = new MemoryStream())
                {
                    zip.Save(ms);
                    response.Content = ms.AsContent();
                }
            }

            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");

            // Name the zip after the folder. e.g. "c:\foo\bar\" --> "bar"
            response.Content.Headers.ContentDisposition.FileName = Path.GetFileName(Path.GetDirectoryName(localFilePath)) + ".zip";
            return Task.FromResult(response);
        }
Пример #3
0
        public HttpResponseMessage GetDiagnostics()
        {
            lock (_lockObj)
            {
                var response = new HttpResponseMessage();
                using (var zip = new ZipFile())
                {
                    foreach (var path in _paths)
                    {
                        if (Directory.Exists(path))
                        {
                            zip.AddDirectory(path, Path.GetFileName(path));
                        }
                    }

                    var ms = new MemoryStream();
                    zip.Save(ms);
                    response.Content = ms.AsContent();
                }
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
                response.Content.Headers.ContentDisposition.FileName = String.Format("dump-{0:MM-dd-H:mm:ss}.zip", DateTime.UtcNow);
                return response;
            }
        }
Пример #4
0
        private HttpResponseMessage CreateResponse(MemoryStream stream, string mediaType)
        {
            _tracer.Trace("Writing {0} bytes", stream.Length);

            HttpContent content = stream.AsContent();

            content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
            // REVIEW: Why is it that we do not write an empty Content-Type here, like for InfoRefsController?

            var response = new HttpResponseMessage();
            response.Content = content;
            response.WriteNoCache();
            return response;
        }
Пример #5
0
        public HttpResponseMessage GetLog()
        {
            lock (_lockObj)
            {
                HttpResponseMessage response = Request.CreateResponse();

                using (var stream = new MemoryStream())
                {
                    using (var zip = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: true))
                    {
                        AddFilesToZip(zip);
                        
                    }
                    response.Content = stream.AsContent();
                }

                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
                response.Content.Headers.ContentDisposition.FileName = String.Format("dump-{0:MM-dd-H:mm:ss}.zip", DateTime.UtcNow);
                return response;
            }
        }
Пример #6
0
        private HttpResponseMessage SmartInfoRefs(string service)
        {
            using (_tracer.Step("InfoRefsService.SmartInfoRefs"))
            {
                var memoryStream = new MemoryStream();

                memoryStream.PktWrite("# service=git-{0}\n", service);
                memoryStream.PktFlush();

                if (service == "upload-pack")
                {
                    //// Initialize the repository from the deployment files (if this is the first commit)
                    //ChangeSet changeSet = _gitServer.Initialize(_configuration, _webRootPath);
                    //_gitServer.AdvertiseUploadPack(memoryStream);

                    //// If we just created the repo, make a 'pseudo' deployment for the initial commit
                    //if (changeSet != null)
                    //{
                    //    _deploymentManager.CreateExistingDeployment(changeSet.Id, _configuration.Username);
                    //}

                    _gitServer.Initialize();
                    _gitServer.AdvertiseUploadPack(memoryStream);
                }
                else if (service == "receive-pack")
                {
                    _gitServer.Initialize();
                    _gitServer.AdvertiseReceivePack(memoryStream);
                }

                _tracer.Trace("Writing {0} bytes", memoryStream.Length);

                HttpContent content = memoryStream.AsContent();

                content.Headers.ContentType =
                    new MediaTypeHeaderValue("application/x-git-{0}-advertisement".With(service));
                // Explicitly set the charset to empty string
                // We do this as certain git clients (jgit) require it to be empty.
                // If we don't set it, then it defaults to utf-8, which breaks jgit's logic for detecting smart http
                content.Headers.ContentType.CharSet = "";

                var responseMessage = new HttpResponseMessage();
                responseMessage.Content = content;
                responseMessage.WriteNoCache();
                return responseMessage;
            }
        }
Пример #7
0
        private HttpResponseMessage SmartInfoRefs(string service)
        {
            using (_tracer.Step("InfoRefsService.SmartInfoRefs"))
            {
                var memoryStream = new MemoryStream();

                memoryStream.PktWrite("# service=git-{0}\n", service);
                memoryStream.PktFlush();

                if (service == "upload-pack")
                {
                    // Initialize the repository from the deployment files (if this is the first commit)
                    _gitServer.Initialize(_configuration, _deploymentTargetPath);
                    _gitServer.AdvertiseUploadPack(memoryStream);
                }
                else if (service == "receive-pack")
                {
                    _gitServer.Initialize(_configuration);
                    _gitServer.AdvertiseReceivePack(memoryStream);
                }

                if (memoryStream.Length < 100)
                {
                    _tracer.TraceWarning("Unexpected number of bytes written. {0} bytes", memoryStream.Length);
                }
                else
                {
                    _tracer.Trace("Writing {0} bytes", memoryStream.Length);
                }

                // TODO: Should we only do this in debug mode?
                _tracer.Trace("Git stream", new Dictionary<string, string>
                {
                    { "type", "gitStream" },
                    { "output", Encoding.UTF8.GetString(memoryStream.ToArray()) }
                });

                HttpContent content = memoryStream.AsContent();

                content.Headers.ContentType =
                    new MediaTypeHeaderValue("application/x-git-{0}-advertisement".With(service));
                // Explicitly set the charset to empty string
                // We do this as certain git clients (jgit) require it to be empty.
                // If we don't set it, then it defaults to utf-8, which breaks jgit's logic for detecting smart http
                content.Headers.ContentType.CharSet = "";

                var responseMessage = new HttpResponseMessage();
                responseMessage.Content = content;
                responseMessage.WriteNoCache();
                return responseMessage;
            }
        }
Пример #8
0
        private HttpResponseMessage CreateResponse(MemoryStream stream, string mediaType)
        {
            _tracer.Trace("Writing {0} bytes", stream.Length);

            // TODO: Should we only do this in debug mode?
            _tracer.Trace("Git stream", new Dictionary<string, string>
            {
                { "type", "gitStream" },
                { "output", Encoding.UTF8.GetString(stream.ToArray()) }
            });

            HttpContent content = stream.AsContent();

            content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
            // REVIEW: Why is it that we do not write an empty Content-Type here, like for InfoRefsController?

            var response = new HttpResponseMessage();
            response.Content = content;
            response.WriteNoCache();
            return response;
        }
Пример #9
0
        public HttpResponseMessage GetLog()
        {
            lock (_lockObj)
            {
                HttpResponseMessage response = Request.CreateResponse();
                using (var zip = new ZipFile())
                {
                    foreach (var path in _paths)
                    {
                        if (Directory.Exists(path))
                        {
                            if (path.EndsWith(Constants.LogFilesPath))
                            {
                                var dir = new DirectoryInfo(path);
                                foreach (var info in dir.GetFileSystemInfos())
                                {
                                    if (info is DirectoryInfo)
                                    {
                                        // excluding FREB as it contains user sensitive data such as authorization header
                                        if (!info.Name.StartsWith("W3SVC", StringComparison.OrdinalIgnoreCase))
                                        {
                                            zip.AddDirectory(info.FullName, Path.Combine(dir.Name, info.Name));
                                        }
                                    }
                                    else
                                    {
                                        zip.AddFile(info.FullName, dir.Name);
                                    }
                                }
                            }
                            else
                            {
                                zip.AddDirectory(path, Path.GetFileName(path));
                            }
                        }
                        else if (File.Exists(path))
                        {
                            zip.AddFile(path, String.Empty);
                        }
                    }

                    var ms = new MemoryStream();
                    zip.Save(ms);
                    response.Content = ms.AsContent();
                }
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
                response.Content.Headers.ContentDisposition.FileName = String.Format("dump-{0:MM-dd-H:mm:ss}.zip", DateTime.UtcNow);
                return response;
            }
        }
Пример #10
0
        private HttpResponseMessage SmartInfoRefs(string service)
        {
            using (_tracer.Step("InfoRefsService.SmartInfoRefs"))
            {
                using (var memoryStream = new MemoryStream())
                {
                    memoryStream.PktWrite("# service=git-{0}\n", service);
                    memoryStream.PktFlush();

                    if (service == "upload-pack")
                    {
                        _gitServer.AdvertiseUploadPack(memoryStream);
                    }
                    else if (service == "receive-pack")
                    {
                        _gitServer.AdvertiseReceivePack(memoryStream);
                    }

                    _tracer.Trace("Writing {0} bytes", memoryStream.Length);

                    HttpContent content = memoryStream.AsContent();

                    content.Headers.ContentType =
                        new MediaTypeHeaderValue("application/x-git-{0}-advertisement".With(service));
                    // Explicitly set the charset to empty string
                    // We do this as certain git clients (jgit) require it to be empty.
                    // If we don't set it, then it defaults to utf-8, which breaks jgit's logic for detecting smart http
                    content.Headers.ContentType.CharSet = "";

                    var responseMessage = new HttpResponseMessage();
                    responseMessage.Content = content;
                    responseMessage.WriteNoCache();
                    return responseMessage;
                }
            }
        }