url.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. var fs = require('fs');
  2. function Url(url) {
  3. this.url = url;
  4. if (this.url.indexOf('?') >= 0)
  5. this.url = this.url.substr(0, this.url.indexOf('?'));
  6. while (this.url.length && this.url[0] === '/') {
  7. this.url = this.url.substr(1);
  8. }
  9. urlParts = this.url.split("/");
  10. this.urlParts = [];
  11. for (var i =0, nbParts = urlParts.length; i < nbParts; i++) {
  12. if (urlParts[i])
  13. this.urlParts.push(urlParts[i]);
  14. }
  15. var stop = url.indexOf("?");
  16. if (stop === -1) {
  17. stop = url.length;
  18. }
  19. this.path = url.substr(0, stop);
  20. var queryTokens = url.substr(stop +1).split("&");
  21. this.queryTokens = {};
  22. for (var i =0, nbTokens = queryTokens.length; i < nbTokens; i++) {
  23. var token = queryTokens[i].split("=");
  24. if (token[0] !== "") {
  25. if (!this.queryTokens[token[0]]) {
  26. this.queryTokens[token[0]] = [];
  27. }
  28. this.queryTokens[token[0]].push(token[1] || true);
  29. }
  30. }
  31. this.serve = null;
  32. try{
  33. if (!this.urlParts.length) {
  34. this.serve = {
  35. filename: "public/index.html"
  36. ,stat: fs.statSync("public/index.html")
  37. };
  38. } else if (this.urlParts.length == 1) {
  39. this.serve = {
  40. filename: "public/" +this.urlParts[0]
  41. ,stat: fs.statSync("public/" +this.urlParts[0])
  42. };
  43. }
  44. } catch (e) {
  45. // Not a public/ file
  46. }
  47. }
  48. Url.prototype.isPublic = function() {
  49. return this.serve !== null;
  50. };
  51. Url.prototype.getReadStream = function() {
  52. return fs.createReadStream(this.serve.filename);
  53. };
  54. Url.prototype.match = function(arr) {
  55. if (arr.length !== this.urlParts.length)
  56. return false;
  57. for (var i=0, arrLen = arr.length; i < arrLen; i++)
  58. if (arr[i] !== this.urlParts[i] && arr[i] !== '?')
  59. return false;
  60. return true;
  61. }
  62. module.exports = { Url: Url };