UNPKG

9.95 kBSource Map (JSON)View Raw
1{"version":3,"file":"server-pub.js","sourceRoot":"","sources":["../../../../src/http/server-pub.ts"],"names":[],"mappings":"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","sourcesContent":["// ==LICENSE-BEGIN==\n// Copyright 2017 European Digital Reading Lab. All rights reserved.\n// Licensed to the Readium Foundation under one or more contributor license agreements.\n// Use of this source code is governed by a BSD-style license\n// that can be found in the LICENSE file exposed on Github (readium) in the project repository.\n// ==LICENSE-END==\n\nimport * as debug_ from \"debug\";\nimport * as express from \"express\";\nimport * as morgan from \"morgan\";\nimport * as path from \"path\";\nimport * as querystring from \"querystring\";\n\nimport { encodeURIComponent_RFC3986, isHTTP } from \"@r2-utils-js/_utils/http/UrlUtils\";\n\nimport { IRequestPayloadExtension, _pathBase64 } from \"./request-ext\";\nimport { Server } from \"./server\";\nimport { trailingSlashRedirect } from \"./server-trailing-slash-redirect\";\n\nconst debug = debug_(\"r2:streamer#http/server-pub\");\n\n// tslint:disable-next-line:variable-name\nexport const serverPub_PATH = \"/pub\";\nexport function serverPub(server: Server, topRouter: express.Application): express.Router {\n\n const urlBook = serverPub_PATH + \"/PATH_BASE64/manifest.json\";\n const urlBookShowAll = \"./manifest.json/show/all\";\n\n const urlReaderNYPL = \"/readerNYPL/?url=PREFIX\" + querystring.escape(urlBook);\n\n const urlReaderEPUBJS =\n \"https://s3.amazonaws.com/epubjs-manifest/examples/manifest.html?href=PREFIZ\" + urlBook;\n\n const urlReaderHADRIEN = \"/readerHADRIEN/?manifest=true&href=PREFIX\" + querystring.escape(urlBook);\n\n const urlReaderHADRIEN_ =\n \"https://hadriengardeur.github.io/webpub-manifest/examples/viewer/?manifest=true&href=PREFIX\"\n + querystring.escape(urlBook);\n\n // const urlReaderREADIUM1 =\n // \"http://readium-2.surge.sh/?epub=PREFIX\"\n // + querystring.escape(urlBook);\n\n const htmlLanding = \"<html><body><h1>PATH_STR</h1><h2><a href='\" +\n urlBookShowAll + \"'>\" + urlBookShowAll + \"</a></h2>\" +\n (server.disableReaders ? \"\" : (\n \"<p>Reader NYPL:<br><a href='\" + urlReaderNYPL + \"'>\" + urlReaderNYPL + \"</a></p>\" +\n \"<p>Reader EPUB.js:<br><a href='\" + urlReaderEPUBJS + \"'>\" + urlReaderEPUBJS + \"</a></p>\" +\n \"<p>Reader HADRIEN:<br><a href='\" + urlReaderHADRIEN + \"'>\" + urlReaderHADRIEN + \"</a></p>\" +\n \"<p>Reader HADRIEN BASIC:<br><a href='\" + urlReaderHADRIEN_ + \"'>\" + urlReaderHADRIEN_ + \"</a></p>\"\n // \"<p>Reader READIUM-1:<br><a href='\" + urlReaderREADIUM1 + \"'>\" + urlReaderREADIUM1 + \"</a></p>\"\n )) +\n \"</body></html>\";\n\n const routerPathBase64 = express.Router({ strict: false });\n routerPathBase64.use(morgan(\"combined\", { stream: { write: (msg: any) => debug(msg) } }));\n\n routerPathBase64.use(trailingSlashRedirect);\n\n routerPathBase64.param(\"pathBase64\", (req, res, next, value, _name) => {\n\n const reqparams = (req as IRequestPayloadExtension).params;\n\n if (value.indexOf(server.lcpBeginToken) === 0 && value.indexOf(server.lcpEndToken) > 0) {\n const i = value.indexOf(server.lcpEndToken);\n const pass64 = value.substr(server.lcpBeginToken.length, i - server.lcpBeginToken.length);\n // const pass = Buffer.from(pass64, \"base64\").toString(\"utf8\");\n (req as IRequestPayloadExtension).lcpPass64 = pass64;\n\n value = value.substr(i + server.lcpEndToken.length);\n reqparams.pathBase64 = value;\n debug(value);\n }\n\n // value is already decoded!\n // const decoded = decodeURIComponent(value);\n const valueStr = Buffer.from(value, \"base64\").toString(\"utf8\");\n if (isHTTP(valueStr)) {\n // debug(`Publication URL: ${valueStr}`);\n\n (req as IRequestPayloadExtension).pathBase64 = value;\n next();\n return;\n }\n\n const found = server.getPublications().find((filePath) => {\n const filePathBase64 = Buffer.from(filePath).toString(\"base64\");\n // const filePathBase64Encoded = encodeURIComponent_RFC3986(filePathBase64);\n // value is already decoded!\n return value === filePathBase64;\n });\n\n if (found) {\n (req as IRequestPayloadExtension).pathBase64 = value;\n next();\n } else {\n res.status(403).send(\"<html><body><p>Forbidden</p><p>INVALID parameter: <code>\"\n + reqparams.pathBase64 + \"</code></p></body></html>\");\n // next(new Error(\"INVALID file param\"));\n }\n });\n\n routerPathBase64.get(\"/:\" + _pathBase64, (req: express.Request, res: express.Response) => {\n\n const reqparams = (req as IRequestPayloadExtension).params;\n\n if (!reqparams.pathBase64) {\n reqparams.pathBase64 = (req as IRequestPayloadExtension).pathBase64;\n }\n\n // pathBase64 is already decoded!\n // const decoded = decodeURIComponent(reqparams.pathBase64);\n const pathBase64Str = Buffer.from(reqparams.pathBase64, \"base64\").toString(\"utf8\");\n debug(`Publication: ${pathBase64Str}`);\n\n const isSecureHttp = req.secure ||\n req.protocol === \"https\" ||\n req.get(\"X-Forwarded-Proto\") === \"https\"\n ;\n\n // const debug = req.hostname + \" -- \"\n // + req.headers.host + \" == \"\n // + req.protocol + \" // \"\n // + req.secure + \" .. \"\n // + req.get(\"X-Forwarded-Proto\");\n\n res.status(200).send(htmlLanding\n // .replace(\"<body>\", \"<body><p>\" + debug + \"</p>\")\n .replace(/PATH_STR/g, path.basename(pathBase64Str))\n .replace(/PATH_BASE64/g, encodeURIComponent_RFC3986(reqparams.pathBase64))\n .replace(/PREFIX/g,\n (isSecureHttp ?\n querystring.escape(\"https://\") : querystring.escape(\"http://\"))\n + req.headers.host).replace(/PREFIZ/g,\n (isSecureHttp ?\n \"https://\" : \"http://\")\n + req.headers.host));\n });\n\n topRouter.use(serverPub_PATH, routerPathBase64);\n\n return routerPathBase64;\n}\n"]}
\No newline at end of file