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('============================='); });