diff --git a/README.md b/README.md
index e084386..fa3258a 100644
--- a/README.md
+++ b/README.md
@@ -71,6 +71,16 @@ I wanted to make code that could be used for people who are just getting started
There will always be more work to do here. ;-)
+#### Updates
+
+##### v0.47 1/7/15 by DW
+
+Fixed first time startup problem creating prefs.json and stats.json.
+
+Also, we now make sure the *domains* folder exists at startup.
+
+Fixed a problem in handling requests if you specified a different folder for PagePark to serve from.
+
#### Questions, comments?
Please post a note on the Server Snacks mail list.
diff --git a/package.json b/package.json
new file mode 100755
index 0000000..4abfa1b
--- /dev/null
+++ b/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "PagePark",
+ "description": "A simple Node.js folder-based HTTP server that serves static and dynamic pages for domains.",
+ "author": "Dave Winer ",
+ "version": "0.40.0",
+ "scripts": {
+ "start": "node pagepark.js"
+ },
+ "dependencies" : {
+ "request": "*",
+ "url": "*",
+ "http": "*",
+ "marked": "*",
+ "dns": "*"
+ },
+ "license": "MIT",
+ "engines": {
+ "node": "0.10.*"
+ }
+ }
diff --git a/pagepark.js b/pagepark.js
index 6467559..8d1075f 100644
--- a/pagepark.js
+++ b/pagepark.js
@@ -1,4 +1,4 @@
-var myVersion = "0.46", myProductName = "Page Park";
+var myVersion = "0.47", myProductName = "PagePark";
//The MIT License (MIT)
@@ -31,13 +31,13 @@ var dns = require ("dns");
var folderPathFromEnv = process.env.pageparkFolderPath; //1/3/15 by DW
-var pageParkPrefs = {
+var pageparkPrefs = {
myPort: 80,
indexFilename: "index"
};
var fnamePrefs = "prefs/prefs.json";
-var pageParkStats = {
+var pageparkStats = {
ctStarts: 0,
whenLastStart: new Date (0),
ctHits: 0, ctHitsToday: 0,
@@ -275,44 +275,6 @@ function getFullFilePath (relpath) { //1/3/15 by DW
}
return (folderpath + relpath);
}
-function writeStats (fname, stats) {
- var f = getFullFilePath (fname);
- fsSureFilePath (f, function () {
- fs.writeFile (f, jsonStringify (stats), function (err) {
- if (err) {
- console.log ("writeStats: error == " + err.message);
- }
- });
- });
- }
-function readStats (fname, stats, callback) {
- var f = getFullFilePath (fname);
- fs.exists (f, function (flExists) {
- if (flExists) {
- fs.readFile (f, function (err, data) {
- if (err) {
- console.log ("readStats: error reading file " + f + " == " + err.message)
- }
- else {
- var storedStats = JSON.parse (data.toString ());
- for (var x in storedStats) {
- stats [x] = storedStats [x];
- }
- writeStats (fname, stats);
- }
- if (callback != undefined) {
- callback ();
- }
- });
- }
- else {
- writeStats (fname, stats);
- if (callback != undefined) {
- callback ();
- }
- }
- });
- }
function getMarkdownTemplate (callback) {
var f = getFullFilePath (mdTemplatePath);
fs.readFile (f, function (err, data) {
@@ -356,7 +318,7 @@ function checkPathForIllegalChars (path) {
function everySecond () {
if (flStatsDirty) {
- writeStats (fnameStats, pageParkStats);
+ writeStats (fnameStats, pageparkStats);
flStatsDirty = false;
}
}
@@ -372,7 +334,7 @@ function handleHttpRequest (httpRequest, httpResponse) {
for (var i = 0; i < list.length; i++) {
var fname = list [i];
if (stringCountFields (fname, ".") == 2) { //something like xxx.yyy
- if (stringNthField (fname, ".", 1).toLowerCase () == pageParkPrefs.indexFilename) { //something like index.wtf
+ if (stringNthField (fname, ".", 1).toLowerCase () == pageparkPrefs.indexFilename) { //something like index.wtf
callback (folder + fname);
return;
}
@@ -440,19 +402,19 @@ function handleHttpRequest (httpRequest, httpResponse) {
//stats
//hits by domain
- if (pageParkStats.hitsByDomain [lowerhost] == undefined) {
- pageParkStats.hitsByDomain [lowerhost] = 1;
+ if (pageparkStats.hitsByDomain [lowerhost] == undefined) {
+ pageparkStats.hitsByDomain [lowerhost] = 1;
}
else {
- pageParkStats.hitsByDomain [lowerhost]++;
+ pageparkStats.hitsByDomain [lowerhost]++;
}
//hits today
- if (!sameDay (now, pageParkStats.whenLastHit)) { //day rollover
- pageParkStats.ctHitsToday = 0;
+ if (!sameDay (now, pageparkStats.whenLastHit)) { //day rollover
+ pageparkStats.ctHitsToday = 0;
}
- pageParkStats.ctHits++;
- pageParkStats.ctHitsToday++;
- pageParkStats.whenLastHit = now;
+ pageparkStats.ctHits++;
+ pageparkStats.ctHitsToday++;
+ pageparkStats.whenLastHit = now;
flStatsDirty = true;
//log the request
@@ -477,14 +439,14 @@ function handleHttpRequest (httpRequest, httpResponse) {
break;
case "/status":
var status = {
- prefs: pageParkPrefs,
- status: pageParkStats
+ prefs: pageparkPrefs,
+ status: pageparkStats
}
httpResponse.writeHead (200, {"Content-Type": "text/plain"});
httpResponse.end (jsonStringify (status));
break;
default: //see if it's a path in the domains folder, if not 404
- var f = domainsPath + host + parsedUrl.pathname;
+ var f = getFullFilePath (domainsPath) + host + parsedUrl.pathname;
if (checkPathForIllegalChars (f)) {
fsSureFilePath (domainsPath, function () { //make sure domains folder exists
fs.stat (f, function (err, stats) {
@@ -520,16 +482,69 @@ function handleHttpRequest (httpRequest, httpResponse) {
}
}
+
+function writeStats (fname, stats, callback) {
+ var f = getFullFilePath (fname);
+ fsSureFilePath (f, function () {
+ fs.writeFile (f, jsonStringify (stats), function (err) {
+ if (err) {
+ console.log ("writeStats: error == " + err.message);
+ }
+ if (callback != undefined) {
+ callback ();
+ }
+ });
+ });
+ }
+function readStats (fname, stats, callback) {
+ var f = getFullFilePath (fname);
+ fsSureFilePath (f, function () {
+ fs.exists (f, function (flExists) {
+ if (flExists) {
+ fs.readFile (f, function (err, data) {
+ if (err) {
+ console.log ("readStats: error reading file " + f + " == " + err.message)
+ if (callback != undefined) {
+ callback ();
+ }
+ }
+ else {
+ var storedStats = JSON.parse (data.toString ());
+ for (var x in storedStats) {
+ stats [x] = storedStats [x];
+ }
+ writeStats (fname, stats, function () {
+ if (callback != undefined) {
+ callback ();
+ }
+ });
+ }
+ });
+ }
+ else {
+ writeStats (fname, stats, function () {
+ if (callback != undefined) {
+ callback ();
+ }
+ });
+ }
+ });
+ });
+ }
+
+
function startup () {
- readStats (fnamePrefs, pageParkPrefs, function () {
- readStats (fnameStats, pageParkStats, function () {
- var now = new Date ();
- console.log (myProductName + " v" + myVersion + ".");
- pageParkStats.ctStarts++;
- pageParkStats.whenLastStart = now;
- flStatsDirty = true;
- http.createServer (handleHttpRequest).listen (pageParkPrefs.myPort);
- setInterval (everySecond, 1000);
+ readStats (fnamePrefs, pageparkPrefs, function () {
+ readStats (fnameStats, pageparkStats, function () {
+ fsSureFilePath (getFullFilePath (domainsPath) + "x", function () { //make sure domains folder exists
+ var now = new Date ();
+ console.log (myProductName + " v" + myVersion + ".");
+ pageparkStats.ctStarts++;
+ pageparkStats.whenLastStart = now;
+ flStatsDirty = true;
+ http.createServer (handleHttpRequest).listen (pageparkPrefs.myPort);
+ setInterval (everySecond, 1000);
+ });
});
});
}