On Wed, May 16, 2012 at 6:14 AM, Alan Hoffmeister <alanhoffmeis...@gmail.com
> wrote:

> Tim that's  a very good idea!
> But how can I share the hash and the dimensions between the view
> helper and the resizing route?
>

Well that depends on the nature of your code.  Is it a framework like
express, is it something else.  If you're running the entire site in a
single process then a single variable in the outer closure would be global
enough.  Just like I wrote in the example, my lookup tables are outside the
helper and the http route handler.  As long as it's in a common place they
can both see in their closures, they will have access.



>
> --
> Att,
> Alan Hoffmeister
>
>
> 2012/5/15 Tim Caswell <t...@creationix.com>:
> > btw, this code isn't perfect.  For example, there is no reason to use the
> > expensive md5 hash.  It's not like the browser is sending you path,
> width,
> > and height and you need to re-hash them.  Any random unique string would
> be
> > fine.  Also the key variable would sufficient as well.  Yes, the url
> > contains the parameters, but they can't be modified to create a new
> value.
> >  Only existing keys would be served.
> >
> > The important part is to create some unique key to embed in the url so
> that
> > later when the request comes in, you have a way to map it to the original
> > resize command.  The caching and batching pattern is described
> > here http://nodebits.org/distilled-patterns
> >
> >
> > On Tue, May 15, 2012 at 3:47 PM, Tim Caswell <t...@creationix.com> wrote:
> >>
> >>
> >>
> >> On Tue, May 15, 2012 at 2:46 PM, Alan Hoffmeister
> >> <alanhoffmeis...@gmail.com> wrote:
> >>>
> >>> Hey guyz, of course I need to validate, I just don't want to expose
> >>> the dimensions.
> >>
> >>
> >> The thing is you have to expose the dimensions if the request coming
> from
> >> a browser includes the dimensions.
> >>
> >> If you want to emulate what php is doing, it's easy enough.  Basically
> >> this would be a template helper that registers a new route when found.
> >>
> >> // load the createHash function from the crypto module
> >> var createHash = require('crypto').createHash;
> >>
> >> // Keep a history of registered routes
> >> var resizes = {};
> >> // Store an index by hash for url routing
> >> var hashes = {};
> >> // Register a new resize command, export this as a template helper.
> >> function resize(path, width, height) {
> >>   var key = path + width + "x" + height; // convert args to a unique
> >> string
> >>   if (resizes[key]) return resizes[key].url; // Check cache to see if
> it's
> >> already registered
> >>   var hash = createHash("md5").update(key).digest("hex"); // calculate
> the
> >> md5 hash of the key to hide the params
> >>   var entry = {
> >>     url: "/images/" + hash + ".png",
> >>     path: path,
> >>     width: width,
> >>     height: height
> >>   };
> >>   // Store the object in the two tables.
> >>   resizes[key] = entry;
> >>   hashes[hash] = entry;
> >>   // return the url.
> >>   return entry.url;
> >> }
> >>
> >>
> >> Then later in your http request handler, add a route to handle these
> >> requests.
> >>
> >> app.get("/images/:hash.png", function (req, res) {
> >>   var entry = hashes[req.params.hash];
> >>   if (!entry) return doErrorHandling();
> >>   resizeImage(entry, function (err, resizedPath) {
> >>     if (err) return doErrorHandling();
> >>   });
> >> });
> >>
> >> And here is some untested code that does caching and batching of the
> async
> >> resize requests
> >>
> >> function resizeImage(entry, callback) {
> >>   // Check if it's been resized already
> >>   if (entry.resizedPath) {
> >>     return callback(null, entry.resizedPath);
> >>   }
> >>   // Check if there is already a pending resize operation on this object
> >>   if (entry.resizeQueue) {
> >>     return entry.resizeQueue.push(callback);
> >>   }
> >>   entry.resizeQueue = [callback];
> >>   doRealResize(entry.path, entry.width, entry.height, function (err,
> >> resizedPath) {
> >>     if (err) return callback(err);
> >>     var callbacks = entry.resizeQueue;
> >>     delete entry.resizeQueue;
> >>     entry.resizedPath = resizedPath;
> >>     callbacks.forEach(function (callback) {
> >>       callback(null, resizedPath);
> >>     });
> >>   });
> >> }
> >>
> >> function doRealResize(path, width, height, callback) {
> >>   // Do actual resize and return the final filename's filepath
> >> }
> >>
> >>> --
> >>> Att,
> >>> Alan Hoffmeister
> >>>
> >>>
> >>> 2012/5/15 Duncan Gmail <duncananguswil...@gmail.com>:
> >>> > You can POST the size as well as use GET.  On the numbers, just
> >>> > validate the input - you should be doing this anyway for all
> inputted data,
> >>> > in all languages.
> >>> >
> >>> > - MRdNk
> >>> >
> >>> > On 15 May 2012, at 15:21, Alan Hoffmeister <
> alanhoffmeis...@gmail.com>
> >>> > wrote:
> >>> >
> >>> >> Marc, that would work, but I'm concerned about security... What if
> >>> >> someone access the url /images/100000/100000/avatar.jpg ?
> >>> >>
> >>> >> --
> >>> >> Att,
> >>> >> Alan Hoffmeister
> >>> >>
> >>> >>
> >>> >> 2012/5/15 Marc Deschamps <md.fle...@gmail.com>:
> >>> >>> I've done something like this using express:
> >>> >>>
> >>> >>> app.get('/images/:width/:height/:filename', routes.images.resize);
> >>> >>>
> >>> >>> Work great, in html i can do:
> >>> >>>
> >>> >>> <img src="/images/70/70/avatar.jpg"/>
> >>> >>>
> >>> >>> --
> >>> >>> Job Board: http://jobs.nodejs.org/
> >>> >>> Posting guidelines:
> >>> >>>
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> >>> >>> You received this message because you are subscribed to the Google
> >>> >>> Groups "nodejs" group.
> >>> >>> To post to this group, send email to nodejs@googlegroups.com
> >>> >>> To unsubscribe from this group, send email to
> >>> >>> nodejs+unsubscr...@googlegroups.com
> >>> >>> For more options, visit this group at
> >>> >>> http://groups.google.com/group/nodejs?hl=en?hl=en
> >>> >>
> >>> >> --
> >>> >> Job Board: http://jobs.nodejs.org/
> >>> >> Posting guidelines:
> >>> >> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> >>> >> You received this message because you are subscribed to the Google
> >>> >> Groups "nodejs" group.
> >>> >> To post to this group, send email to nodejs@googlegroups.com
> >>> >> To unsubscribe from this group, send email to
> >>> >> nodejs+unsubscr...@googlegroups.com
> >>> >> For more options, visit this group at
> >>> >> http://groups.google.com/group/nodejs?hl=en?hl=en
> >>> >
> >>> > --
> >>> > Job Board: http://jobs.nodejs.org/
> >>> > Posting guidelines:
> >>> > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> >>> > You received this message because you are subscribed to the Google
> >>> > Groups "nodejs" group.
> >>> > To post to this group, send email to nodejs@googlegroups.com
> >>> > To unsubscribe from this group, send email to
> >>> > nodejs+unsubscr...@googlegroups.com
> >>> > For more options, visit this group at
> >>> > http://groups.google.com/group/nodejs?hl=en?hl=en
> >>>
> >>> --
> >>> Job Board: http://jobs.nodejs.org/
> >>> Posting guidelines:
> >>> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> >>> You received this message because you are subscribed to the Google
> >>> Groups "nodejs" group.
> >>> To post to this group, send email to nodejs@googlegroups.com
> >>> To unsubscribe from this group, send email to
> >>> nodejs+unsubscr...@googlegroups.com
> >>> For more options, visit this group at
> >>> http://groups.google.com/group/nodejs?hl=en?hl=en
> >>
> >>
> >
> > --
> > Job Board: http://jobs.nodejs.org/
> > Posting guidelines:
> > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> > You received this message because you are subscribed to the Google
> > Groups "nodejs" group.
> > To post to this group, send email to nodejs@googlegroups.com
> > To unsubscribe from this group, send email to
> > nodejs+unsubscr...@googlegroups.com
> > For more options, visit this group at
> > http://groups.google.com/group/nodejs?hl=en?hl=en
>
> --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines:
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to nodejs@googlegroups.com
> To unsubscribe from this group, send email to
> nodejs+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/nodejs?hl=en?hl=en
>

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to