Клонирование Git-репозитория, выбрасывание ArithmeticException

Мы используем Bonobo Git Server для размещения некоторых внутренних репозиториев git. При попытке проверить один из наших репозиториев мы получаем эту ошибку:

Сбой RPC; результат =22, код HTTP = 500

фатальный: удаленный конец неожиданно завис

В средстве просмотра событий Windows оно регистрирует это сообщение:

Exception information: 
    Exception type: ArithmeticException 
    Exception message: Overflow or underflow in the arithmetic operation.
Request information: 
    Request URL: http://localhost:50287/MyRepo.git/git-upload-pack 
    Request path: /MyRepo.git/git-upload-pack 

Если я отлаживаю Bonobo локально, никакое исключение не выдается в C#; это происходит из-за процесса мерзавца. Код выдаёт Process бежать git.exe вот так:

using (var process = System.Diagnostics.Process.Start(info))
{
    inStream.CopyTo(process.StandardInput.BaseStream);
    process.StandardInput.Write('\0');
    process.StandardOutput.BaseStream.CopyTo(outStream);

    process.WaitForExit();
}

Аргументы команды, передаваемые git:

выгрузить пакет --stateless-rpc D:\PathToRepos\MyRepo

Если я бегу git.exe с помощью команды clone из командной строки проект клонируется должным образом (с предупреждением templates not found)

Я думаю, что это проблема типа данных между C# и тем, что мерзавец передается на Response.OutputStream,

1 ответ

Решение

Проблема была связана с буферизацией ответа. Он будет пытаться буферизовать весь поток в памяти перед отправкой, и с большими репозиториями это вызвало ArithmeticException, поскольку Response.Buffer по умолчанию true, он должен быть явно установлен на false до отправки данных. Данные также должны быть явно прочитаны и переданы в виде фрагментов.

Response.Buffer = false;

while ((read = process.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
{
    Response.OutputStream.Write(buffer, 0, read);
    Response.OutputStream.Flush();
}
Другие вопросы по тегам