CORS в DotCloud, требуется длина 411

Вкратце: как мне обойти ошибки «411 Length required» от nginx, работающего в DotCloud?

У меня есть API с поддержкой CORS, развернутый как служба Python на платформе DotCloud. Когда мой клиент javascript пытается получить к нему доступ, браузер запускается с запросом OPTIONS, но возвращает 411.

Похоже, nginx в DotCloud не любит HTTP-запросы с пустым телом. Я видел предложения добавить заголовок «Content-Length: 0» или попытаться использовать модуль chunkin, но я не могу сделать ни того, ни другого:

  • Я не контролирую заголовки HTTP-запросов, которые браузер добавляет для своего запроса OPTIONS.
  • Я не думаю, что смогу установить сторонний модуль nginx в DotCloud. Даже если бы я мог, это может даже не помочь, поскольку в запросе нет заголовка «Transfer-encoding: chunked».

Любые идеи, как обойти эту проблему?

Обновление:

Помещение следующего в nginx.conf решает мою насущную проблему. Подобно чанкину, он перехватывает 411 ошибок и возвращает стандартный ответ, если метод запроса равен OPTIONS. Наткнулся на это в этом репозитории.

error_page 411 = @cors;
location @cors {
  if ($request_method = OPTIONS) {
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'Content-Type, Authorization, ...';
    add_header Access-Control-Max-Age '1800';
    add_header Content-Length 0;
    add_header Content-Type text/plain;
    return 200;
  }
  return 411;
}

Это не идеально, так как я хотел бы обрабатывать эти ответы в коде Python, а не в конфигурации nginx. И я ожидаю проблем в будущем с запросами DELETE и HEAD — у них также нет тела запроса.


person Pēteris Caune    schedule 06.11.2012    source источник
comment
Я думаю, вам стоит попробовать чанкин. Он просто обрабатывает ошибку 411, и это то, что вам нужно.   -  person Boris Ivanov    schedule 06.11.2012
comment
К сожалению, чанкин недоступен на dotcloud...   -  person Pēteris Caune    schedule 06.11.2012
comment
Видел это? github.com/dotcloud/nginx-on-dotcloud   -  person Boris Ivanov    schedule 06.11.2012
comment
инженер dotCloud — мы рассматриваем потенциальное обходное решение, позволяющее преобразовывать запросы, разбитые на части, в запросы, не разделенные на части, на вышестоящем уровне. Не могу назвать ETA, но мы определенно думаем об этом; так что со временем проблема должна исчезнуть, и вы сможете избавиться от дополнительной конфигурации Nginx! (В качестве альтернативы мы могли бы включить чанки во всех службах, связанных с Nginx...)   -  person jpetazzo    schedule 07.11.2012


Ответы (1)


Другой способ обойти эту проблему — не использовать nginx и использовать вместо него gunicorn.
Вот пример dotcloud.yml для такой конфигурации:

www:
    type: python-worker
    config:
        python_version: v2.7
    processes:
        api: gunicorn -b 0.0.0.0:$PORT_WWW -w 8 wsgi:app
    ports:
        www: http
person 3on    schedule 07.12.2012