Назад | Перейти на главную страницу

Как настроить перезапись URL в Squid 3.5 на Windows 10

Я пытался установить squid 3.5.27 в окне Windows, используя настройку 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 состоит из @<path-to-python> -u <path to script>)

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'

процесс (строка) никогда не вызывается

Если вы ссылаетесь на нашу сборку 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;
    }
}