function sendRequest (connection) {
            header.type = FCGI_BEGIN;
            header.contentLength = 8;
            writer.writeHeader(header);
            writer.writeBegin(begin);
            connection.write(writer.tobuffer());

            header.type = FCGI_PARAMS;
            header.contentLength = fastcgi.getParamLength(params);
            writer.writeHeader(header);
            writer.writeParams(params);
            connection.write(writer.tobuffer());


            header.type = FCGI_PARAMS;
            header.contentLength = 0;
            writer.writeHeader(header);
            connection.write(writer.tobuffer());
            
            // header.type = FCGI_STDOUT;
            // writer.writeHeader(header);
            // connection.write(writer.tobuffer());

            if((request.method != 'PUT' && request.method != 'POST')) {
                endRequest()        
            } else {
                for(var j = 0; j < collectedStdin.length; ++j) {
                    header.type = FCGI_STDIN;
                    header.contentLength = collectedStdin[j].length;
                    header.paddingLength = 0;
                    writer.writeHeader(header);
                    writer.writeBody(collectedStdin[j].toString());        
                    connection.write(writer.tobuffer());
                }
                collectedStdin = [];                    
                if(noMoreData) {
                    endRequest();
                }
            }
        };
Esempio n. 2
0
function fcgi_get_values(socket, callback) {
    socket.on('data', on_data);

    var values = [
        ['FCGI_MAX_CONNS', ''],
        ['FCGI_MAX_REQS', ''],
        ['FCGI_MPXS_CONNS', '']
    ];

    var writer = new FCGI.writer();
    writer.encoding = 'binary';

    writer.writeHeader({
        version: FCGI.constants.version,
        type: FCGI.constants.record.FCGI_GET_VALUES,
        recordId: 0,
        contentLength: FCGI.getParamLength(values),
        paddingLength: 0
    });
    writer.writeParams(values);
    socket.write(writer.tobuffer());

    writer.writeHeader({
        version: FCGI.constants.version,
        type: FCGI.constants.record.FCGI_GET_VALUES,
        recordId: 0,
        contentLength: 0,
        paddingLength: 0
    });

    socket.write(writer.tobuffer());

    var fcgi_values = {};
    var timeout = setTimeout(got_all_values, 100);

    function on_data(data) {
        var parser = new FCGI.parser();
        parser.encoding = 'utf8';
        parser.onRecord = on_record;
        parser.onError  = function on_error(er) {
            this.onRecord = this.onError = function () {};
            callback(er);
        };

        parser.execute(data);
    }

    function on_record(record) {
        var params = record.body.params || {};
        var keys = Object.keys(params);

        keys.forEach(function (key) {
            fcgi_values[key] = num_or_str(params[key]);
        });

        if (keys.length === 0) got_all_values();
    }

    function got_all_values() {
        clearTimeout(timeout);
        socket.removeListener('data', on_data);
        callback(null, fcgi_values);
    }
}
Esempio n. 3
0
    function process_request() {
        if (!socket) return;

        if (Object.keys(requests_in_flight).length && !options.multiplex) return;

        var fcgi_request = pending_requests.shift();
        if (!fcgi_request) return;

        requests_in_flight[fcgi_request.id] = fcgi_request;

        var req = fcgi_request.req;
        var res = fcgi_request.res;

        var cgi = cgiEnv.createEnvironment(req);

        if (fcgi_request.options.env) {
            for (var v in fcgi_request.options.env) {
                cgi[v] = fcgi_request.options.env[v];
            }
        }

        // Write the request to FastCGI.
        var writer = new FCGI.writer();
        writer.encoding = 'binary';

        // Begin
        writer.writeHeader({
            version: FCGI.constants.version,
            type: FCGI.constants.record.FCGI_BEGIN,
            recordId: fcgi_request.id,
            contentLength: 8,
            paddingLength: 0
        });
        writer.writeBegin({
            role: FCGI.constants.role.FCGI_RESPONDER,
            flags: fcgi_request.keepalive
        });
        socket.write(writer.tobuffer());

        var params = Object.keys(cgi).map(function (v) {
            return [v, cgi[v]];
        });

        // Parameters
        writer.writeHeader({
            version: FCGI.constants.version,
            type: FCGI.constants.record.FCGI_PARAMS,
            recordId: fcgi_request.id,
            contentLength: FCGI.getParamLength(params),
            paddingLength: 0
        });
        writer.writeParams(params);
        socket.write(writer.tobuffer());

        // End parameters
        writer.writeHeader({
            version: FCGI.constants.version,
            type: FCGI.constants.record.FCGI_PARAMS,
            recordId: fcgi_request.id,
            contentLength: 0,
            paddingLength: 0
        });
        socket.write(writer.tobuffer());

        // STDIN
        if (req.method != 'PUT' && req.method != 'POST') {
            end_request();
        } else {
            req.on('data', function (chunk) {
                writer.writeHeader({
                    version: FCGI.constants.version,
                    type: FCGI.constants.record.FCGI_STDIN,
                    recordId: fcgi_request.id,
                    contentLength: chunk.length,
                    paddingLength: 0
                });
                writer.writeBody(chunk);

                var data = writer.tobuffer();
                socket.write(data);
            });

            req.on('end', end_request);
        }

        function end_request() {
            writer.writeHeader({
                version: FCGI.constants.version,
                type: FCGI.constants.record.FCGI_STDIN,
                recordId: fcgi_request.id,
                contentLength: 0,
                paddingLength: 0
            });
            socket.write(writer.tobuffer());

            /* At this point the request can be considered sent to the server,
             * and it would be dangerous to re-send without knowing more
             * details.
             */
            fcgi_request.sent = true;
        }
    }