Я пытался установить squid 3.5.27 на windows box, используя настройку store-id-program.
Однако, похоже, что как бы я его не настроил, запущенный мной python-скрипт сразу же получает конец ввода (как можно увидеть, добавив трассировку) и затем squid перестает запускаться, жалуясь
Squid Cache (Version 3.5.27): Terminated abnormally.
FATAL: The store_id helpers are crashing too rapidly, need help!
Я пробовал всевозможные варианты (очевидно, не одновременно):
store_id_program /cygdrive/c/apps/squid/local/bin/texture_rewrite.bat
store_id_program /cygdrive/c/apps/squid/local/bin/texture_rewrite.py
store_id_program /cygdrive/c/apps/Python27/python.exe -u c:\apps\squid\local\bin\texture_rewrite.py
(Файл .bat состоит из @<путь к-python> -u <путь к скрипту>
)
Squid работает нормально, если я не пытаюсь настроить переписывание url.
Для справки, python скрипт выглядит так:
while True:
line = sys.stdin.readline()
print >>sys.stderr, line
if not line:
break
line = line.strip()
if line != '':
process(line)
print >>sys.stderr, 'exit'
process(line) никогда не вызывается
Если вы ссылаетесь на нашу сборку Squid для Windows с squid.diladele.com - то, скорее всего, это связано с тем, как Cygwin моделирует конвейер между двоичным файлом Cygwin (squid ) и ваш собственный двоичный файл Windows (python). Если я не ошибаюсь, каналы моделируются как неблокирующий перекрывающийся ввод-вывод над файлами - который получает ERROR_IO_PENDING сразу после чтения - что интерпретируется как EOF в любой консольной программе.
Частично эта проблема обсуждается в https://www.cygwin.com/ml/cygwin/2006-03/msg00330.html , https://github.com/nodejs/ node / issues / 3006 и многие другие.
Лучше всего скомпилировать urlrewriter как код C ++ из cygwin - в этом случае код будет автоматически использовать ту же реализацию канала, что и squid и таким образом работают. Или используйте побайтовое чтение из перекрывающихся файлов, как мы это делаем в нашем urlrewriter (просто образец)
read_result read(char& c)
{
// this is the value to return
CHAR value = 0;
DWORD read = 0;
DWORD len = sizeof(CHAR);
// construct overlapped structure
OVERLAPPED ovl = {};
{
ovl.hEvent = hevent_;
}
// read one byte from input
BOOL bres = ::ReadFile(stdin_, &value, len, &read, &ovl);
DWORD err = ::GetLastError();
if (bres)
{
// see if we read 0 bytes
if (0 == read)
{
// yes, read of 0 bytes from the redirected pipe in cygwin means eof???
return reached_eof;
}
// debug check
_ASSERTE('\0' != value);
// otherwise store char
c = value;
// nice
return read_success;
}
// we have encountered and error, see which one
switch (err)
{
case ERROR_HANDLE_EOF:
return reached_eof;
case ERROR_IO_PENDING:
{
// wait until overlapped read completes
BOOL bres = GetOverlappedResult(stdin_, &ovl, &read, TRUE);
if (bres)
{
// good, we have read one byte
c = value;
// nice
return read_success;
}
// overlapped result failed, there might be a lot of reason for this, see if EOF is there
if (ERROR_HANDLE_EOF == GetLastError())
return reached_eof;
// in case of all other errors we fail the operation
return read_error;
}
break;
default:
// some unknown error, we also fail the operation
return read_error;
}
}