UNPKG

web_plsql

Version:

The Express Middleware for Oracle PL/SQL

128 lines (113 loc) 3.58 kB
/* * Prepare the CGI information */ import os from 'node:os'; import {URL} from 'node:url'; /** * @typedef {import('express').Request} Request * @typedef {import('./types.js').environmentType} environmentType * @typedef {import('./types.js').configPlSqlType} configPlSqlType */ /** @type {environmentType} */ const DEFAULT_CGI = { PLSQL_GATEWAY: 'WebDb', GATEWAY_IVERSION: '2', SERVER_SOFTWARE: 'web_plsql', GATEWAY_INTERFACE: 'CGI/1.1', SERVER_PORT: '', SERVER_NAME: os.hostname(), REQUEST_METHOD: '', PATH_INFO: '', SCRIPT_NAME: '', REMOTE_ADDR: '', SERVER_PROTOCOL: '', REQUEST_PROTOCOL: '', REMOTE_USER: '', HTTP_COOKIE: '', HTTP_USER_AGENT: '', HTTP_HOST: '', HTTP_ACCEPT: '', HTTP_ACCEPT_ENCODING: '', HTTP_ACCEPT_LANGUAGE: '', HTTP_REFERER: '', HTTP_X_FORWARDED_FOR: '', WEB_AUTHENT_PREFIX: '', DAD_NAME: '', DOC_ACCESS_PATH: 'doc', DOCUMENT_TABLE: '', PATH_ALIAS: '', REQUEST_CHARSET: 'UTF8', REQUEST_IANA_CHARSET: 'UTF-8', SCRIPT_PREFIX: '', }; /** * Create the HTTP_COOKIE string * * @param {Request} req - The req object represents the HTTP request. * @returns {string} - The string representation of the cookies. */ const getCookieString = (req) => { let cookieString = ''; for (const propName in req.cookies) { cookieString += `${propName}=${req.cookies[propName]};`; } return cookieString; }; /** * Get the script name and DAD name from a URL * * @param {Request} req - The req object represents the HTTP request. * @returns {{script: string; prefix: string; dad: string}} - The DAD structure. */ const getPath = (req) => { // create a valid url const validUrl = `${req.protocol}://${os.hostname()}${req.originalUrl}`; // get the pathname from the url (new URL('https://example.org/abc/xyz?123').pathname => /abc/xyz) const pathname = new URL(validUrl).pathname; const tmp = trimPath(pathname.substring(0, pathname.lastIndexOf('/') + 1)); const script = `/${tmp}`; const prefix = `/${tmp.substring(0, tmp.lastIndexOf('/'))}`; const dad = tmp.substring(tmp.indexOf('/') + 1); return {script, prefix, dad}; }; /** * Get a path that is not enclodes in slashes * * @param {string} value - The value to trim. * @returns {string} - The trimmed value. */ const trimPath = (value) => value.replace(/^\/+|\/+$/g, ''); /** * Create a CGI object * * @param {Request} req - The req object represents the HTTP request. * @param {string} doctable - The document table. * @param {environmentType} cgi - The additional cgi. * @returns {environmentType} CGI object */ export const getCGI = (req, doctable, cgi) => { const PROTOCOL = req.protocol ? req.protocol.toUpperCase() : ''; const PATH = getPath(req); /** @type {environmentType} */ const CGI = { SERVER_PORT: typeof req.socket.localPort === 'number' ? req.socket.localPort.toString() : '', REQUEST_METHOD: req.method, PATH_INFO: req.params.name, SCRIPT_NAME: PATH.script, REMOTE_ADDR: (req.ip ?? '').replace('::ffff:', ''), SERVER_PROTOCOL: `${PROTOCOL}/${req.httpVersion}`, REQUEST_PROTOCOL: PROTOCOL, HTTP_COOKIE: getCookieString(req), HTTP_USER_AGENT: req.get('user-agent') ?? '', HTTP_HOST: req.get('host') ?? '', HTTP_ACCEPT: req.get('accept') ?? '', HTTP_ACCEPT_ENCODING: req.get('accept-encoding') ?? '', HTTP_ACCEPT_LANGUAGE: req.get('accept-language') ?? '', HTTP_REFERER: req.get('referer') ?? '', HTTP_X_FORWARDED_FOR: req.get('x-forwarded-for') ?? '', DAD_NAME: PATH.dad, DOCUMENT_TABLE: doctable, SCRIPT_PREFIX: PATH.prefix, }; return Object.assign({}, DEFAULT_CGI, CGI, cgi); };