srfp_genesis_backup_2.js 11.2 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 custom_log = require('./config/logger');
var config = require('./config/config');
var stat = require('./utils/SutisStat');
var alarm = require('./utils/SutisAlarm');
var detail = require('./utils/SutisDetail');
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-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\sGMT$/g;
    var regex_commandId = /^\d+$/g;

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

    if (reqModDate != null) {
        // logger.error('Req Header Not null');
        if (!regex_datetime.test(reqModDate)) {
            logger.error('[invalid] date format: ' + reqModDate);
            errorCase = 'req.If-Modified-Since=' + reqModDate;

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

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

    if (!req.query.name) {
        logger.error('[missing or invalid]: name');
        errorCase = 'req.name=' + req.query.name;
    } else if (!req.query.type) {
        logger.error('[missing or invalid]: type');
        errorCase = 'req.type=' + req.query.type;
    } else if (!req.query.commandId) {
        logger.error('[missing or invalid]: commandId');
        errorCase = 'req.commandId=' + req.query.commandId;
    }

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

};

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 + '"}}';
        var missingInvalid = 'req.name=' + req.query.name;
        return [resc, desc, prompt, missingInvalid];
    }

    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 + '"}}';
            var missingInvalid = 'req.name=' + req.query.name;
            return [resc, desc, prompt, missingInvalid];
        }
    } else {
        var resc = '40401';
        var desc = 'File not found';
        var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
        var missingInvalid = 'req.name=' + req.query.name;
        return [resc, desc, prompt, missingInvalid];
    }
};

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 headerReq = checkHeader(req, fileReq[2]);

    var session = req.query.commandId;
    var cmd = 'getMultimedia';
    var identity = '';
    var reqfile = req.query.name;

    writeApplog(req);

    //  [Check Request]
    if (request == true && fileReq[0] == true) {
        var resc = '20000';
        var desc = 'Success';

        var headerReq = checkHeader(req, fileReq[2]);
        var statusCode = headerReq[0];
        var mtime = headerReq[1];
        var size = headerReq[2];

        sumaryLog = logger.summary(session, cmd, identity, resc, desc);
        sumaryLog.addSuccessBlock('client', cmd, 'null', 'Success');
        sumaryLog.addSuccessBlock('null', 'getFile', resc, desc);
        stat.recv(cmd, resc);
        stat.retn(cmd, resc);
        detail.write(req, cmd, size, 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);

            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);

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

        }
    } else if (request == true && fileReq[0] != true) {
        sumaryLog = logger.summary(session, cmd, identity, fileReq[0], fileReq[1]);
        sumaryLog.addSuccessBlock('client', cmd, 'null', 'Success');
        sumaryLog.addErrorBlock('null', 'getFile', fileReq[0], fileReq[1], fileReq[3]);
        stat.recv(cmd, fileReq[0]);
        stat.retn(cmd, fileReq[0]);
        detail.write(req, cmd, null, null);

    } else if (request != true) {
        var status_code = request[0].substring(0, 3);
        logger.error('[statusCode]: ' + status_code);
        logger.error('[resultCode]: ' + request[0] + ', [developerMessage]: ' + request[1]);
        sumaryLog = logger.summary(session, cmd, identity, request[0], request[1]);
        sumaryLog.addErrorBlock('client', cmd, request[0], request[1], request[3]);
        stat.recv(cmd, request[0]);
        stat.retn(cmd, request[0]);
        alarm.recv(cmd, request[0]);
        detail.write(req, cmd, null, null);

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


    } else {
        var resc = '50000';
        var desc = 'System error';
        var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';;

        logger.error('[statusCode]: 500');
        logger.error('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
        sumaryLog = logger.summary(session, cmd, identity, resc, desc);
        sumaryLog.addErrorBlock('client', cmd, resc, desc, 'system_error');
        stat.recv(cmd, resc);
        stat.retn(cmd, resc);
        alarm.recv(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 identity = 'null';

    var summaryLog;

    custom_log.error('[statusCode]: 404');
    custom_log.error('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);


    custom_log.statRecv(cmd, resc);
    custom_log.statRetn(cmd, resc);
    custom_log.alarm(cmd, resc);

    summaryLog = custom_log.summaryLog(session, cmd, identity, resc, desc);
    summaryLog.addErrorBlock('client', cmd, resc, desc, 'req.url=' + req.url);
    summaryLog.flush();

    custom_log.detail(req, cmd, null, null);

    res.writeHead(404, {
        "Content-Type": 'application/json'
    });
    res.write(prompt);
    res.end();

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