9eadeb9fbb
refs #5942, #6150 There were a few key problems I was looking to solve with this: - Introduce a single point of truth for what the URL for accessing the API should be - Provide a simple way to configure the utility (much like a true SDK) As of this commit, this utility is still automatically available in a Ghost theme. To use it on an external site, the code would look like: ``` <script type="text/javascript" src="http://my-ghost-blog.com/shared/ghost-url.min.js"></script> <script type="text/javascript"> ghost.init({ clientId: "<your-client-id>", clientSecret: "<your-client-secret>" }); </script> ``` To achieve this, there have been a number of changes: - A new `apiUrl` function has been added to config, which calculates the correct URL. This needs to be unified with the other url generation functions as a separate piece of work. - The serveSharedFile middleware has been updated, so that it can serve files from / or /shared and to substitute `{{api-url}}` as it does `{{blog-url}}`. - ghost-url.js and ghost-url.min.js have been updated to be served via the serveSharedFile middleware - ghost-url.js has been changed slightly, to take the url from an inline variable which is substituted the first time it is served - `{{ghost_head}}` has been updated, removing the api url handling which is now in config/url.js and removing the configuration of the utility in favour of calling `init()` after the script is required - `{{ghost_head}}` has also had the meta tags for client id and secret removed - tests have been updated
52 lines
1.9 KiB
JavaScript
52 lines
1.9 KiB
JavaScript
var crypto = require('crypto'),
|
|
fs = require('fs'),
|
|
path = require('path'),
|
|
config = require('../config');
|
|
|
|
// ### ServeSharedFile Middleware
|
|
// Handles requests to robots.txt and favicon.ico (and caches them)
|
|
function serveSharedFile(file, type, maxAge) {
|
|
var content,
|
|
corePath = config.paths.corePath,
|
|
filePath,
|
|
blogRegex = /(\{\{blog-url\}\})/g,
|
|
apiRegex = /(\{\{api-url\}\})/g;
|
|
|
|
filePath = file.match(/^shared/) ? path.join(corePath, file) : path.join(corePath, 'shared', file);
|
|
|
|
return function serveSharedFile(req, res, next) {
|
|
if (req.path === '/' + file) {
|
|
if (content) {
|
|
res.writeHead(200, content.headers);
|
|
res.end(content.body);
|
|
} else {
|
|
fs.readFile(filePath, function readFile(err, buf) {
|
|
if (err) {
|
|
return next(err);
|
|
}
|
|
|
|
if (type === 'text/xsl' || type === 'text/plain' || type === 'application/javascript') {
|
|
buf = buf.toString().replace(blogRegex, config.url.replace(/\/$/, ''));
|
|
buf = buf.toString().replace(apiRegex, config.apiUrl());
|
|
}
|
|
content = {
|
|
headers: {
|
|
'Content-Type': type,
|
|
'Content-Length': buf.length,
|
|
ETag: '"' + crypto.createHash('md5').update(buf, 'utf8').digest('hex') + '"',
|
|
'Cache-Control': 'public, max-age=' + maxAge
|
|
},
|
|
body: buf
|
|
};
|
|
res.writeHead(200, content.headers);
|
|
res.end(content.body);
|
|
});
|
|
}
|
|
} else {
|
|
next();
|
|
}
|
|
};
|
|
}
|
|
|
|
module.exports = serveSharedFile;
|