2013-11-13 6 views
3

Я хочу, чтобы включить CORS в моем контейнере Rackspace CluodFiles, поэтому после прочтения документации, я вижу, что я должен установить некоторые контейнер метаданных (я использую Python и Pyrax):Как заставить CloudFiles FormPost вернуть заголовок «Access-Control-Allow-Origin», чтобы включить CORS?

from pyrax import cloudfiles 

cloudfiles.set_container_metadata(container_name, { 
    'X-Container-Meta-Access-Control-Allow-Origin': 'localhost:8000', 
    'X-Container-Meta-Access-Control-Expose-Headers': 'Access-Control-Allow-Origin', 
    'X-Container-Meta-Access-Control-Max-Age': '10', 
}) 
print cloudfiles.get_container_metadata(container_name) 

И я получаю в качестве вывода :

{'x-container-meta-access-control-allow-origin': 'localhost:8000', 
'x-container-meta-access-control-expose-headers': 'Access-Control-Allow-Origin', 
'x-container-meta-access-control-max-age': '10', 
'x-container-meta-access-log-delivery': 'false'} 

Но браузер не получает в предполетной запрос OPTIONS в Access-Control-Allow-Origin, поэтому он отменяет вызов AJAX:

HTTP/1.1 401 Unauthorized 
Content-Length: 131 
Content-Type: text/html; charset=UTF-8 
Allow: HEAD, GET, PUT, POST, COPY, OPTIONS, DELETE 
X-Trans-Id: txXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
Date: Wed, 13 Nov 2013 20:07:34 GMT 
Connection: keep-alive 

Что не хватает?

Спасибо!

+0

OP - Что вы используете на стороне браузера для обработки загрузки файлов. –

+0

@ChrisRasco Извините, это была опечатка, я использую 'localhost: 8000' как значение Allow Origin; Я также пробовал с 'example.com'; но проблема не является неправильным значением заголовка, просто нет заголовка вообще. Я собираюсь проверить страницу примера сейчас. Благодаря! –

ответ

4

Rackspace имеет документы о том, как включить CORS для контейнера here. Пример 7.11 - это тестовая страница CORS, которая позволит вам протестировать вашу конфигурацию за пределами попыток загрузки файлов.

Test CORS Page - принимает токен и URL-адрес объекта или контейнера, и давайте попробуем вызвать на нем метод HTTP.

ПРИМЕЧАНИЕ: Я удалил «Удалить» метод, который может иметь непредсказуемые результаты (например, удаление вашего контейнера/объекта)

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <title>Test CORS</title> 
    </head> 
    <body> 

    Token<br><input id="token" type="text" size="64"><br><br> 

    Method<br> 
    <select id="method"> 
     <option value="GET">GET</option> 
     <option value="HEAD">HEAD</option> 
     <option value="POST">POST</option> 
     <option value="PUT">PUT</option> 
    </select><br><br> 

    URL (Container or Object)<br><input id="url" size="64" type="text"><br><br> 

    <input id="submit" type="button" value="Submit" onclick="submit(); return false;"> 

    <pre id="response_headers"></pre> 
    <p> 
    <hr> 
    <pre id="response_body"></pre> 

    <script type="text/javascript"> 
     function submit() { 
      var token = document.getElementById('token').value; 
      var method = document.getElementById('method').value; 
      var url = document.getElementById('url').value; 

      document.getElementById('response_headers').textContent = null; 
      document.getElementById('response_body').textContent = null; 

      var request = new XMLHttpRequest(); 

      request.onreadystatechange = function (oEvent) { 
       if (request.readyState == 4) { 
        responseHeaders = 'Status: ' + request.status; 
        responseHeaders = responseHeaders + '\nStatus Text: ' + request.statusText; 
        responseHeaders = responseHeaders + '\n\n' + request.getAllResponseHeaders(); 
        document.getElementById('response_headers').textContent = responseHeaders; 
        document.getElementById('response_body').textContent = request.responseText; 
       } 
      } 

      request.open(method, url); 
      request.setRequestHeader('X-Auth-Token', token); 
      request.send(null); 
     } 
    </script> 

    </body> 
</html> 

Чтобы установить эти значения вне pyrax или любой другой SDK, я использовал следующий код:

https://gist.github.com/chrisrasco/7455804

Запомнить установить имя пользователя, apikey, и путь к контейнеру в в соответствующих местах.

+2

На самом деле, моя ошибка заключается в том, что я устанавливаю значение источника только для имени домена и (необязательно) номера порта. Но браузеры также отправляют схему ('http: //' или 'https: //') вместе с доменом, поэтому заголовок 'X-Container-Meta-Access-Control-Allow-Origin', установленный на контейнере, также должен начните со схемы ('http: //' или 'https: //') в зависимости от настройки вашего сервера. Спасибо @ChrisRasco за то, что указали мне в правильном направлении! –

 Смежные вопросы

  • Нет связанных вопросов^_^