2012-05-04 6 views
0

Я пытаюсь сделать HTTP-запрос из сценария Adobe Illustrator (этот вопрос не связан с JSX, хотя) через BridgeTalk в локальное приложение Rails, используя соединение Socket (как вы видите - много, что может пойти не так;)).HTTP: «ERROR bad Request-Line»

Наконец удалось получить запрос через, но приложение Rails выдает ошибку:

ERROR bad Request-Line `GET /test.json HTTP/1.1'. 

В настоящее время нет специальных заголовков не посылаются - набор вверх довольно проста:

var connection = new Socket; 
var response = ''; 

var host  = '127.0.0.1:3000'; 
var path  = '/test.json'; 
var method  = 'GET'; 

var request = method + " " + path + " HTTP/1.1"; 

if (connection.open(host)) { 
    connection.write(request); 
    response = connection.read(999999); 
} else { 
    $.writeln('Socket connection failed.'); 
} 
connection.close(); 

I Предполагая, что запрос неквалифицирован, но я не уверен, что ожидается.

Приложение Rails работает на WEBrick.

Любая помощь или подсказка о том, что Rails ожидает здесь, будем весьма благодарны.


Update

Кажется, что WEBrick ожидает возврат каретки в конце строки запроса: \r\n.

К сожалению, я использую BridgeTalk для выполнения фрагмента кода в Bridge, который требует, чтобы я использовал uneval() или toSource() о функции, упомянутой выше. Они, кажется, чтобы избежать обратных косых черт, превращая

GET /test.json HTTP/1.1\r\n 

в

GET /test.json HTTP/1.1\\r\\n 

вызывает ту же ошибку.

Любые идеи?

ответ

0

Потребовалось время, пока я не получил это понял, но как обычно - «слишком много движущихся частей, что делает его трудно обнаружить проблему»:

Определение запроса, используя закодированный вариант возврата и декодирования каретки по назначению поможет:

var request = decodeURI(method + " " + path + " HTTP/1.1%0d%0a"); 

Однако, оказывается, что собственно запрос должен заканчиваться в \n\n не \r\n, так что сделайте это:

var request = decodeURI(method + " " + path + " HTTP/1.1%0a%0a"); 

Теперь запросы проходят через и теперь более длинные ошибки.

+0

Я был замечен на этом некоторое время, вы можете избежать строк с кодировкой URL, если вместо этого вы открываете соединение как «BINARY», «connection.open (host,« BINARY »)». Из руководства по инструментам: 'CRLF-последовательности преобразуются в LF, если кодировка не установлена ​​в BINARY.' – spencewah

+0

Спасибо! Я дам это, если у меня появится шанс. – polarblau

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