srfp_genesis_backup.js 9.83 KB
var express = require('express');
var path = require('path');
var app = express();
var fs = require('fs');
var util = require('util');
var crypto = require('crypto');
var http = require("http");
var url = require("url");
//var logger = require('./config/logger');
var config = require('./config/config');
var stat = require('./utils/SutisStat');
var detail = require('./utils/SutisDetail');
//var summaryLog = require('./utils/SutisLogSummary');
var logger = require('./utils/SutisLogSummary');

function checkReq(req) {
    var regex_filetype = /^.*\.(jpg|jpeg|png|mp3|mp4|m4a)$/ig;
    var regex_datetime = /(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s\d{1,2}\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s[0-2][0-3]:[0-5][0-9]:[0-5][0-9]\sGMT$/g;

    // var reqModDate = req.get('If-Modified-Since')
    // logger.error('>>>>>>>>> ' + req.url);

    if (req.query.name != null && req.query.type != null && req.query.commandId != null) {
        if (regex_filetype.test(req.query.name) == true) {
            return true;
        }
    }

    var resc = '40300';
    var desc = 'Missing or invalid parameter';
    var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
    return [resc, desc, prompt];

};

function checkFile(req) {
    var path;
    if (req.query.type === 'audio') {
        path = config.mediaPath.audio + req.query.name;
    } else if (req.query.type === 'video') {
        path = config.mediaPath.video + req.query.name;
    } else if (req.query.type === 'image') {
        path = config.mediaPath.image + req.query.name;
    } else {
        var resc = '40401';
        var desc = 'File not found';
        var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';;
        return [resc, desc, prompt];
    }

    if (fs.existsSync(path)) {
        try {
            fs.accessSync(path, fs.constants.R_OK);
            var file_name = req.query.name;
            return [true, file_name, path];
        } catch (err) {
            var resc = '40101';
            var desc = 'Access denied';
            var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';;
            return [resc, desc, prompt];
        }
    } else {
        var resc = '40401';
        var desc = 'File not found';
        var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';;
        return [resc, desc, prompt];
    }
};

function checkHeader(req, path_file) {
    try {
        // var reqModDate = req.headers['If-Modified-Since'];
        var reqModDate = req.get('If-Modified-Since')
        var stats = fs.statSync(path_file);
        var mtime = stats.mtime;
        var size = stats['size'];

        if (reqModDate != null) {
            reqModDate = new Date(reqModDate);

            logger.info('[If-Modified-Since]: ' + reqModDate.toUTCString());
            logger.info('[Modified-File]    : ' + mtime.toUTCString());

            if (reqModDate.toUTCString() == mtime.toUTCString()) {
                logger.info('[Req Header]: If-Modified-Since == Modified File');
                return [304, mtime, size];
            } else {
                logger.info('[Req Header]: If-Modified-Since != Modified File');
                return [200, mtime, size];
            }
        } else {
            logger.info('[Req Header]: No-header: If-Modified-Since');
            logger.info('[Modified-File]: ' + mtime.toUTCString());
            return [200, mtime, size];
        }
    } catch (error) {
        logger.error('[Error check header!!!]');
        return [200, mtime, size];
    }
};

function writeApplog(req) {

    logger.info('[Start getMultimedia Validate Parameter]: ' + 'name: ' + req.query.name + ', type=' + req.query.type + ', commandId=' + req.query.commandId);
    logger.info('[incommigHeader: If-Modified-Since]: ' + req.get('If-Modified-Since'));
    logger.info('[incomming url]: ' + req.protocol + '://' + req.get('host') + req.originalUrl);
}

app.listen(3000, function() {
    logger.info('=============================');
    logger.info('SRFP-Genesis on port 3000!');
});

app.get('/multiMedia.json', function(req, res) {
    var sumaryLog;
    var request = checkReq(req);
    var fileReq = checkFile(req);

    var session = req.query.commandId;
    var cmd = 'getMultimedia';
    var identiry = 'null';

    writeApplog(req);

    //  [Check Request]
    if (request == true && fileReq[0] == true) {
    	var headerReq = checkHeader(req, fileReq[2]);
        var statusCode = headerReq[0];
        var mtime = headerReq[1];
        var size = headerReq[2];

        // logger.info('>>> Last-Modified: ' + mtime.toUTCString());

        var content_type;
        var regex_image = /^.*\.(jpg|jpeg)$/ig;
        var regex_png = /^.*\.(png)$/ig;
        var regex_mp3 = /^.*\.(mp3)$/ig;
        var regex_mp4 = /^.*\.(mp4)$/ig;
        var regex_m4a = /^.*\.(m4a)$/ig;

        if (regex_image.test(checkFile(req)[1])) {
            content_type = 'image/jpeg';
        } else if (regex_png.test(checkFile(req)[1])) {
            content_type = 'image/png';
        } else if (regex_mp3.test(checkFile(req)[1])) {
            content_type = 'audio/mpeg';
        } else if (regex_mp4.test(checkFile(req)[1])) {
            content_type = 'video/mp4';
        } else if (regex_m4a.test(checkFile(req)[1])) {
            content_type = 'audio/m4a';
        }

        logger.info('[Path File]: ' + fileReq[2]);

        if (statusCode == 200) {
            logger.info('[statusCode]: 200');
            var resc = '20000';
            var desc = 'Success';

            logger.info('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);

            sumaryLog = logger.summary(session, cmd, identiry);
            sumaryLog.addSuccessBlock('client', cmd, resc, desc);
            stat.recv(cmd, resc);
            stat.retn(cmd, resc);
            detail.write(req, cmd, size, mtime);

            res.writeHead(200, {
                "Last-Modified": mtime.toUTCString(),
                "Content-Disposition": 'attachment; filename="' + checkFile(req)[1] + '"',
                "Content-Type": content_type,
                "Content-Length": size
            });
            fs.createReadStream(checkFile(req)[2]).pipe(res);
            // res.write(img);
            // res.end();

        }
        //  return 304!
        else {
            logger.info('[statusCode]: 304');
            var resc = '20000';
            var desc = 'Success';

            logger.info('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);

            sumaryLog = logger.summary(session, cmd, identiry);
            sumaryLog.addSuccessBlock('client', cmd, resc, desc);
            stat.recv(cmd, resc);
            stat.retn(cmd, resc);
            detail.write(req, cmd, size, mtime);

            res.writeHead(304, {
                // "Content-Disposition": 'attachment; filename="' + checkFile(req)[1] + '"',
                "Content-Type": content_type,
                "Content-Length": size
            });
            res.end();

        }
    } else {
        if (request != true) {
            logger.error('[resultCode]: ' + request[0] + ', [developerMessage]: ' + request[1]);
            sumaryLog = logger.summary(session, cmd, identiry);
            sumaryLog.addErrorBlock('client', cmd, request[0], request[1]);
            stat.recv(cmd, request[0]);
            stat.retn(cmd, request[0]);
            detail.write(req, cmd, size, mtime);

            res.writeHead(request[0].substring(0, 3), {
                // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
                "Content-Type": 'application/json'
            });
            res.write(request[2]);
            res.end();
            // res.send();

        } else if (fileReq != true) {

            logger.error('[resultCode]: ' + fileReq[0] + ', [developerMessage]: ' + fileReq[1]);
            sumaryLog = logger.summary(session, cmd, identiry);
            sumaryLog.addErrorBlock('client', cmd, fileReq[0], fileReq[1]);
            stat.recv(cmd, fileReq[0]);
            stat.retn(cmd, fileReq[0]);
            detail.write(req, cmd, size, mtime);

            res.writeHead(fileReq[0].substring(0, 3), {
                // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
                "Content-Type": 'application/json'
            });
            res.write(fileReq[2]);
            res.end();
        } else {
            var resc = '50000';
            var desc = 'System error';
            var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';;

            logger.error('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
            sumaryLog = logger.summary(session, cmd, identiry);
            sumaryLog.addErrorBlock('client', cmd, resc, desc);
            stat.recv(cmd, resc);
            stat.retn(cmd, resc);
            detail.write(req, cmd, null, null);

            res.writeHead(500, {
                // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
                "Content-Type": 'application/json'
            });
            res.write(prompt);
            res.end();
        }
    }
    sumaryLog.flush();
    logger.info('=============================');
});

app.use(function(req, res, next) {
    writeApplog(req);
    var resc = '40400';
    var desc = 'Unknown URL';
    var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';

    var session = 'null';
    var cmd = 'getMultimedia';
    var identiry = 'null';

    logger.error('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
    sumaryLog = logger.summary(session, cmd, identiry);
    sumaryLog.addErrorBlock('client', cmd, resc, desc);
    stat.recv(cmd, resc);
    stat.retn(cmd, resc);
    detail.write(req, cmd, null, null);
    sumaryLog.flush();

    res.status(404).send(prompt);

    logger.info('=============================');
});