2012-05-04 2 views
0

J'essaie de faire une requête HTTP à partir d'un Adobe Illustrator Script (cette question n'est pas vraiment liée à JSX, cependant) via BridgeTalk à une application locale Rails en utilisant une connexion Socket (comme vous le voyez, beaucoup de choses pourraient mal se passer;)).HTTP: "ERROR bad Request-Line"

a finalement réussi à obtenir une demande à travers, mais l'application Rails génère une erreur:

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

Actuellement aucun en-tête spéciaux sont envoyés - la mise en place est assez simple:

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 Je suppose que la demande est mal formulée, mais je ne suis pas sûr de ce qui est attendu.

L'application Rails s'exécute sur WEBrick.

Une aide ou un conseil sur ce que Rails attend ici, serait grandement appréciée.


Mise à jour

Il semble que WEBrick attend un retour chariot à la fin de la ligne de demande: \r\n.

Malheureusement j'utilise BridgeTalk pour exécuter un morceau de code dans Bridge qui nécessite que j'utilise uneval() ou toSource() sur la fonction mentionnée ci-dessus. Ceux-ci semblent échapper les antislashes, la conversion

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

dans

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

provoquant la même erreur.

Des idées?

Répondre

0

A pris un certain temps jusqu'à ce que je suis ce compris, mais comme d'habitude - « trop de pièces mobiles font qu'il est difficile de repérer le problème »:

Définition de la demande en utilisant la version codée du retour chariot et le décodage la destination aidera:

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

Cependant, il se avère qu'une demande appropriée devrait prendre fin en \n\n pas \r\n, alors faites ceci:

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

Maintenant, les demandes arrivent et maintenant des erreurs de lancer plus longues.

+0

J'ai été bloqué sur cela pendant un moment, vous pouvez éviter les chaînes codées URL si vous ouvrez plutôt la connexion comme "BINARY", 'connection.open (hôte," BINARY ")'. A partir du Guide d'outils: 'Les séquences CRLF sont converties en LF sauf si l'encodage est défini sur BINARY.' – spencewah

+0

Merci! Je vais essayer si j'ai une chance. – polarblau