Я пытаюсь написать собственный бэкэнд HTTP-сервера с нуля на языке C для Linux. И мне это также нужно для размещения моих репозиториев Git и управления запросами, связанными с Git (
, push, pull и т. д.). И я решил использовать «git-http-backend» в качестве CGI-программы для обработки ответов с данными, необходимыми клиентам. Все глобальные переменные обрабатываются и проверяются правильно.
Когда я пытаюсь отправить клон git http://:8080/git/
< /code> на ПК с сервером, я вижу, что все работает нормально, и «git-http-backend» возвращает мне заголовок HTTP (без кода и версии протокола HTTP), код начала списка ссылок (
) и некоторые ссылки (SHA-1 + относительный путь) без магического кода 0000.
Прежде всего я отправляю код (
) и версию протокола HTTP, требуемую для сокета. После этого я отправляю буфер с данными, возвращаемыми «git-http-backend», и заканчиваю все отправкой 0000 клиенту. И ничего не происходит... Насколько я знаю, он должен отправить еще один запрос HTTP-методом POST. Но внутри (чтение) при прослушивании сокета встречается только бесконечный цикл. Я также пытался отправить клиенту 0x06 («ACK») отдельно, но ничего не меняется. Если я быстро перезапущу бэкэнд, он получит следующий запрос, но git клиента напишет в консоль "
Код: Выделить всё
fatal: git fetch-pack: expected ACK/NAK, got a flush packet
". В чем моя ошибка?
Я использую сокет, привязку, принятие, чтение, запись и выберите в моем коде. И я помню, что каждая строка заголовка HTTP должна заканчиваться \r\n.
Подробнее здесь:
https://stackoverflow.com/questions/792 ... fs-to-clie