Нечетная проблема jQuery - запрос Ajax к программе C не совсем работает

У меня есть эта базовая настройка:

  • Программа
  • C открывает сокет на определенном неиспользуемом порту (скажем, 1234) и ждет, специально прослушивая HTTP-запросы.
  • Веб-страница на том же компьютере, написанная в основном в CGI, использует jQuery для создания запроса AJAX, ориентированного на localhost: 1234.

Я хочу, чтобы программа C просматривала запрос, извлекала некоторые данные из него и отвечала простым HTTP-ответом, содержащим некоторые данные. Это полуработающее: веб-страница видит ответ, читает в правильных HTTP-заголовках (проверяя это через firebug), но не получает данные ответа. Открытие в Wireshark показывает, что весь ответ проходит, заголовки и данные вместе, но jQuery, похоже, просто игнорирует сами данные.

jQuery достаточно прост:

$.ajax({ url: "http://localhost:6112",
              data: {test1: 'testa', test2: 'testb'},
              success: function(d,s,x) {
                     alert("Data: " + d);
                     alert("Status: " + s);
                     alert("Object: " + x);
              },
              error: function(xhr) {
                     alert("Error: " + xhr.status);
              }
});

Когда я нажимаю кнопку, которая вызывает это, запрос делается; поле "Данные:" появляется пустым; Статус появляется как "Успех", и создается объект. Функция "error" не вызвана.

Что странно (для меня, во всяком случае) заключается в том, что если я открою Firefox и укажу его на localhost:1234, он загрузится точно так, как я ожидал, - программа C ответит данными, указывающими, что я не послал никаких данных; Firefox делает это (в частности, данные ответа) просто прекрасным. То же самое происходит, если я подключу telnet к этому порту и вручную отправлю (несколько глупый) HTTP-запрос. Итак, насколько я знаю, это должно быть что-то напуганное с jQuery, но я не понимаю, что это может быть!

Я попытался установить параметр dataType в запросе AJAX для разных вещей - text/html, text/plain; Я даже попробовал XML и модифицировал программу C, чтобы отправить ее. Нехорошо - все делают то же самое. Веб-страница получает правильные заголовки HTTP, но не содержит данных.

Также нет ошибок, которые я могу найти; Firebug не жалуется; программа C не жалуется... только одна из этих "очень тихо работающих" ошибок.

Любые идеи, люди?


изменить: Добавление фактических запросов через Firefox, по запросу

Успешный запрос (как, например, перебрасывание localhost: 6112 в строку URL):

GET / HTTP/1.1
Host: localhost:6112
User-Agent: (is it weird that I feel weird about posting my User-Agent string?)
Accept: text/html, application/xhtml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.7
Keep-Alive: 115
Connection: keep-alive

Successful response:
HTTP/1.1 200 OK
Host: localhost
Content-Type: text/plain
Content-Length: 55
<html><head></head><body>Done and done.</body></html>

Заголовки AJAX:

GET /?test1=testa&test2=testb HTTP/1.1
Host: localhost:6112
User-Agent: (UA string)
Accept: text/plain, */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Referer: localhost/cgi-bin/runtime.cgi
Origin: localhost

Resulting response headers:
HTTP/1.1 200 OK
Host: localhost
Content-Type: text/plain
Content-Length: 55
<html><head></head><body>Done and done.</body></html>

(Примечание: потому что я новичок, мне пришлось обрезать некоторые из этих гиперссылок)

Ответ 1

Другой порт на том же веб-сайте по-прежнему нарушает политику домена XHR Cross. Единственный способ, которым он мог работать в междоменном режиме, - это либо JSONP (не поддерживает запросы POST), либо прокси-сервер на одном сервере.

JSONP является самым легким, что в действительности просто добавляет тег <script> к вашему <head> к URL-адресу, который будет выполнять запрос GET (так что bye bye postdata). И вы можете заставить его вызвать обратный вызов javascript, добавив "callback =?" GET для URL-адреса - тогда ответ должен был бы вызвать метод javascript, названный в параметре "обратный вызов". Если это имеет смысл...

jQuery, вероятно, обнаруживает, что он является удаленным URL-адресом и пытается использовать JSONP, но поскольку никаких обратных вызовов не было выполнено (и ошибка не вызвана).