Клонирование 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();
}