Как настроить перезапись url под squid 3.5 на windows 10

Я пытался установить 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) никогда не вызывается

0
задан 27 October 2018 в 19:49
1 ответ

Если вы ссылаетесь на нашу сборку 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;
    }
}
1
ответ дан 4 December 2019 в 15:49

Теги

Похожие вопросы