1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.serverPub = exports.serverPub_PATH = void 0;
|
4 | var debug_ = require("debug");
|
5 | var express = require("express");
|
6 | var morgan = require("morgan");
|
7 | var path = require("path");
|
8 | var querystring = require("querystring");
|
9 | var UrlUtils_1 = require("r2-utils-js/dist/es5/src/_utils/http/UrlUtils");
|
10 | var request_ext_1 = require("./request-ext");
|
11 | var server_trailing_slash_redirect_1 = require("./server-trailing-slash-redirect");
|
12 | var debug = debug_("r2:streamer#http/server-pub");
|
13 | exports.serverPub_PATH = "/pub";
|
14 | function serverPub(server, topRouter) {
|
15 | var urlBook = exports.serverPub_PATH + "/PATH_BASE64/manifest.json";
|
16 | var urlBookShowAll = "./manifest.json/show/all";
|
17 | var urlReaderNYPL = "/readerNYPL/?url=PREFIX" + querystring.escape(urlBook);
|
18 | var urlReaderEPUBJS = "https://s3.amazonaws.com/epubjs-manifest/examples/manifest.html?href=PREFIZ" + urlBook;
|
19 | var urlReaderHADRIEN = "/readerHADRIEN/?manifest=true&href=PREFIX" + querystring.escape(urlBook);
|
20 | var urlReaderHADRIEN_ = "https://hadriengardeur.github.io/webpub-manifest/examples/viewer/?manifest=true&href=PREFIX"
|
21 | + querystring.escape(urlBook);
|
22 | var htmlLanding = "<html><body><h1>PATH_STR</h1><h2><a href='" +
|
23 | urlBookShowAll + "'>" + urlBookShowAll + "</a></h2>" +
|
24 | (server.disableReaders ? "" : ("<p>Reader NYPL:<br><a href='" + urlReaderNYPL + "'>" + urlReaderNYPL + "</a></p>" +
|
25 | "<p>Reader EPUB.js:<br><a href='" + urlReaderEPUBJS + "'>" + urlReaderEPUBJS + "</a></p>" +
|
26 | "<p>Reader HADRIEN:<br><a href='" + urlReaderHADRIEN + "'>" + urlReaderHADRIEN + "</a></p>" +
|
27 | "<p>Reader HADRIEN BASIC:<br><a href='" + urlReaderHADRIEN_ + "'>" + urlReaderHADRIEN_ + "</a></p>")) +
|
28 | "</body></html>";
|
29 | var routerPathBase64 = express.Router({ strict: false });
|
30 | routerPathBase64.use(morgan("combined", { stream: { write: function (msg) { return debug(msg); } } }));
|
31 | routerPathBase64.use(server_trailing_slash_redirect_1.trailingSlashRedirect);
|
32 | routerPathBase64.param("pathBase64", function (req, res, next, value, _name) {
|
33 | var reqparams = req.params;
|
34 | if (value.indexOf(server.lcpBeginToken) === 0 && value.indexOf(server.lcpEndToken) > 0) {
|
35 | var i = value.indexOf(server.lcpEndToken);
|
36 | var pass64 = value.substr(server.lcpBeginToken.length, i - server.lcpBeginToken.length);
|
37 | req.lcpPass64 = pass64;
|
38 | value = value.substr(i + server.lcpEndToken.length);
|
39 | reqparams.pathBase64 = value;
|
40 | debug(value);
|
41 | }
|
42 | var valueStr = Buffer.from(value, "base64").toString("utf8");
|
43 | if (UrlUtils_1.isHTTP(valueStr)) {
|
44 | req.pathBase64 = value;
|
45 | next();
|
46 | return;
|
47 | }
|
48 | var found = server.getPublications().find(function (filePath) {
|
49 | var filePathBase64 = Buffer.from(filePath).toString("base64");
|
50 | return value === filePathBase64;
|
51 | });
|
52 | if (found) {
|
53 | req.pathBase64 = value;
|
54 | next();
|
55 | }
|
56 | else {
|
57 | res.status(403).send("<html><body><p>Forbidden</p><p>INVALID parameter: <code>"
|
58 | + reqparams.pathBase64 + "</code></p></body></html>");
|
59 | }
|
60 | });
|
61 | routerPathBase64.get("/:" + request_ext_1._pathBase64, function (req, res) {
|
62 | var reqparams = req.params;
|
63 | if (!reqparams.pathBase64) {
|
64 | reqparams.pathBase64 = req.pathBase64;
|
65 | }
|
66 | var pathBase64Str = Buffer.from(reqparams.pathBase64, "base64").toString("utf8");
|
67 | debug("Publication: " + pathBase64Str);
|
68 | var isSecureHttp = req.secure ||
|
69 | req.protocol === "https" ||
|
70 | req.get("X-Forwarded-Proto") === "https";
|
71 | res.status(200).send(htmlLanding
|
72 | .replace(/PATH_STR/g, path.basename(pathBase64Str))
|
73 | .replace(/PATH_BASE64/g, UrlUtils_1.encodeURIComponent_RFC3986(reqparams.pathBase64))
|
74 | .replace(/PREFIX/g, (isSecureHttp ?
|
75 | querystring.escape("https://") : querystring.escape("http://"))
|
76 | + req.headers.host).replace(/PREFIZ/g, (isSecureHttp ?
|
77 | "https://" : "http://")
|
78 | + req.headers.host));
|
79 | });
|
80 | topRouter.use(exports.serverPub_PATH, routerPathBase64);
|
81 | return routerPathBase64;
|
82 | }
|
83 | exports.serverPub = serverPub;
|
84 |
|
\ | No newline at end of file |