Same regex caching

David Yu david.yu.ftw at gmail.com
Fri Jul 22 01:23:38 UTC 2011


On Fri, Jul 22, 2011 at 2:10 AM, Igor Sysoev <igor at sysoev.ru> wrote:

> On Thu, Jul 21, 2011 at 10:53:51PM +0800, David Yu wrote:
> > On Thu, Jul 21, 2011 at 10:43 PM, Igor Sysoev <igor at sysoev.ru> wrote:
> >
> > > On Thu, Jul 21, 2011 at 10:18:06PM +0800, David Yu wrote:
> > > > Hi,
> > > >
> > > > I wanted to ask if the same regex used in multiple conditions is the
> same
> > > > cached-compiled version?
> > > > Eg I need to validate the all the (sub)request params before sending
> it
> > > > upstream:
> > > >
> > > > location /foo {
> > > >
> > > > if ($time !~ /(\d\d):(\d\d):(\d\d)/) { return 400; }
> > > > if ($arg_time !~ /(\d\d):(\d\d):(\d\d)/) { return 400; }
> > > >
> > > > }
> > > >
> > > > #note that in the real app, I'll have lots of repeated regex for
> email,
> > > > phone, used in every if directive
> > > >
> > > > location /bar {
> > > >
> > > > if ($arg_time !~ /(\d\d):(\d\d):(\d\d)/) { return 400; }
> > > > set_form_input $form_time time_finished;
> > > > if ($form_time !~ /(\d\d):(\d\d):(\d\d)/) { return 400; }
> > > >
> > > > }
> > > >
> > > > What I'm trying to do is send the params to redis with its lua
> scripting
> > > > engine handling the *pre-validated* request.
> > > > Redis is single-process while nginx can have multiple workers ... so
> its
> > > > only fitting to let nginx do validation for redis :-)
> > >
> > > No, each regex is compiled separately.
> > >
> > Thanks for the quick reply.
> > I'm thinking maybe the nginx map can act as the regex cache for the same
> > ones.
> >
> > set $map_regex_time $arg_time
> > if ( !$map_regex_time) return { 400; }
> >
> > set_form_input $map_regex_time time_finished;
> > if (! $map_regex_time) return { 400; }
> >
> > Since I'll literally have hundreds of fields using the same regex, this
> > might help?
>
> I do not understand the issue.
>
map $map_arg_time $map_regex_time {
  ~/(\d\d):(\d\d):(\d\d)/   1;
}

location /foo {
  set $map_arg_time $arg_time
  if ( !$map_regex_time ) return { 400; }

  set_form_input $map_arg_time time_finished;
  if ( !$map_regex_time ) return { 400; }

}

Since I'll literally have hundreds of fields using the same regex for
validation, this might help?
If there are better ways to do validation, please do tell.

Cheers


>
>
> --
> Igor Sysoev
>
> _______________________________________________
> nginx mailing list
> nginx at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx
>



-- 
When the cat is away, the mouse is alone.
- David Yu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx/attachments/20110722/b1327652/attachment-0001.html>


More information about the nginx mailing list