Search code examples
httpescapingextendscript

HTTP: "ERROR bad Request-Line"


I'm trying to make a HTTP request from a Adobe Illustrator Script (this question is not really JSX-related, though) via BridgeTalk to a local Rails app using a Socket connection (as you you see — plenty that could go wrong ;) ).

Finally managed to get a request through, but the Rails app throws an error:

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

Currently no special headers are sent — the set–up is pretty 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'm assuming that the request is illformed, but I'm not sure what's expected.

The Rails app runs on WEBrick.

Any help or hint on what Rails expects here, would be greatly appreciated.


Update

It seems that WEBrick expects a carriage return in the end of the request line: \r\n .

Unfortunately I’m using BridgeTalk to execute a piece of code within Bridge which requires me to use uneval() or toSource() on the function mentioned above. These seem to escape backslashes, converting

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

into

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

causing the same error.

Any ideas?


Solution

  • Took a while until I got this figured out, but as usual — “too many moving parts are making it hard to spot the problem”:

    Defining the request using the encoded version of the carriage return and decoding on destination will help:

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

    However, it turns out that a proper request should end in \n\n not \r\n, so make this:

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

    Now the requests come through and now longer throw errors.