Как отвечать на запрос HTTP OPTIONS на сервере JSON-RPC

Мой клиент JSON-RPC (браузер с использованием dojo JSON-RPC) делает запрос JSON-RPC (dojo.callRemote) на мой сервер JSON-RPC на myserver.com/12345 (Python 2.5, SimpleJSONRPCServer).

Затем сервер получает HTTP-запрос с заголовком «OPTIONS / HTTP / 1.1», который по умолчанию он не может обрабатывать, поэтому я написал специальный обработчик для этого запроса.

Заголовок запроса из браузера гласит:

OPTIONS / HTTP/1.1 Host: myserver:12345 User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100214 Linux Mint/8 (Helena) Firefox/3.5.8 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.7,de;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Origin: http://myserver.com Access-Control-Request-Method: POST Access-Control-Request-Headers: x-requested-with 

И ответ, который я отправляю, выглядит так:

 HTTP/1.0 200 OK Server: BaseHTTP/0.3 Python/2.5 Date: Mon, 05 Apr 2010 18:58:34 GMT Access-Control-Allow-Method: POST Access-Control-Allow-Headers: POST Allow: POST Content-Type: application/json-rpc Content-length: 0 

Но в браузере я получаю следующую ошибку:

Ошибка: Не удалось загрузить статус http://myserver.com:12345 : 0

Я проверил, что JSON-Сервис доступен из сети.

Теперь вопрос в том, что браузер (скажем, Firefox) ожидает ответа слушателей-ответчиков? Или, может быть, проблема кроется в другом месте?

    3 Solutions collect form web for “Как отвечать на запрос HTTP OPTIONS на сервере JSON-RPC”

    См. Спецификацию CORS .

    (BTW; есть реестр заголовков для HTTP, см. http://www.iana.org/assignments/message-headers/prov-headers.html и http://www.iana.org/assignments/message-headers/perm -headers.html , который указал бы вам на правильную спецификацию).

    добавьте код и попробуйте, он отлично работает для меня:

     class CGIHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): ... ... def do_OPTIONS(self): self.send_response(200, "ok") self.send_header('Access-Control-Allow-Origin', self.headers.dict['origin']) self.send_header('Access-Control-Allow-Methods', 'POST, OPTIONS') 

    Проверьте мой код. Он работает для javascript-кода клиента, работающего в браузере Chrome.

     class MyHandler(BaseHTTPRequestHandler): def do_OPTIONS(self): self.send_response(200, "ok") self.send_header('Access-Control-Allow-Origin', '*') self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') self.send_header("Access-Control-Allow-Headers", "X-Requested-With") def do_GET(self): self.send_response(200) self.send_header('Access-Control-Allow-Origin', '*') self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write("<html><body>Hello world!</body></html>") self.connection.shutdown(1) 
     
    Interesting Posts for Van-Lav

    Парсинг Параметр URI и пары ключевых слов

    Зачем мне «sys.argv» запуска QApplication в PyQt?

    Как я могу украсить метод экземпляра классом декоратора?

    Python с памятью ключей, которые были доступны?

    Как запустить CGI «hello world» с помощью python http.server

    Создание массива в numpy / scipy путем итерации в Python?

    Подождите, пока не закончится определенный процесс (зная «pid»)

    ошибка при определении sc в sparkcontext

    Python RE (слово для проверки первой буквы чувствительно к регистру и остальное нечувствительно к регистру)

    Как мне подобрать кривую синуса для моих данных с помощью pylab и numpy?

    Python numpy: невозможно преобразовать datetime64 в datetime64 (для использования с Numba)

    Проблемы разработки и распространения Python 3

    Python: как работает функция cmp_to_key functools?

    Пожалуйста, объясните, почему эти две встроенные функции ведут себя по-разному, когда передаются в аргументах ключевого слова

    Как вы прослушиваете уведомления из iTunes на Mac (используя NSDistributedNotificationCenter)

    Python - лучший язык программирования в мире.