Hi,

Good explanation !!!

But, How do you improve this C program ?

On Wed, Apr 29, 2009 at 3:09 PM, Brian Mearns <mearn...@gmail.com> wrote:

> On Wed, Apr 29, 2009 at 1:58 PM, ricardo figueiredo
> <ricardoogra...@gmail.com> wrote:
> > Sorry,
> >
> > Let me explain my situation again.
> > I'm using directive RewriteMap using external rewriting program.
> > This program is developed in language C.
> >
> > When I require a page in the browser is shown an error (Bad Request 400).
> >
> > My program in C to rewriting URL
> >
> > #include <stdio.h>
> >   int main() {
> >   int id = 0;
> >     fscanf(stdin, "%d", &id);
> >     switch(id) {
> >        case 111: fprintf(stdout, "/index.html");  break;
> >        case 222: fprintf(stdout, "/new.html");  break;
> >        case 333: fprintf(stdout, "/teste.php?var=4/8"); break;
> >     }
> >
> >     fflush(stdout);
> >     return 0;
> > }
> >
> > My httpd.conf is:
> >
> >   RewriteEngine on
> >   RewriteLock /usr/local/apache2/logs/file.lock
> >   RewriteMap prgmap prg:/usr/local/apache2/file
> >   RewriteRule ^/(.*) ${prgmap:$1}
> >
> > My rewritelog:
> >
> > [localhost/sid#8b4cd68][rid#8ce45a0/initial] (2) init rewrite engine with
> > requested uri /111
> > [localhost/sid#8b4cd68][rid#8ce45a0/initial] (3) applying pattern
> '^/(.*)'
> > to uri '/111'
> > [localhost/sid#8b4cd68][rid#8ce45a0/initial] (5) map lookup OK:
> map=prgmap
> > key=111 -> val=
> > [localhost/sid#8b4cd68][rid#8ce45a0/initial] (2) rewrite '/111' -> ''
> > [localhost/sid#8b4cd68][rid#8ce45a0/initial] (2) local path result:
> >
> > Why is this error ??
> >
> > I hope have given all information.
> >
> > Ricardo
> >
> >
>
> First of all, like Eric said yesterday, you need a loop in your main
> function. The program is not invoked every time the rewrite needs to
> be applied, it is started once when the Apache server starts, and just
> gets a new line of input for each request to be mapped.
>
> Second, you need to terminate your output with a newline. Apparently,
> apache gave up waiting for your program to give it a valid output (one
> that is terminated by a newline) and decided to go with an empty
> value, instead. Using fflush is probably a good idea, but you'll want
> to make sure it's inside the loop, so the output gets flushed for
> every mapping.
>
> To make this a proper program for this use, it should read an entire
> line up to and including the linebreak (which Eric also said). I think
> gets or fgets will do the job just fine, and then if you want to use
> scanf, you can use sscanf to scan the string that you read with fgets.
> Second, you'll want some way to terminate the loop, so it doesn't run
> forever. I'm not sure exactly how this is normally handled (or maybe
> apache even forcibly kills the program when it's done, but that's
> unlikely). My best guess would be if you read an EOF on standard
> input, you can quit.
>
> -Brian
>
> --
> Feel free to contact me using PGP Encryption:
> Key Id: 0x3AA70848
> Available from: http://keys.gnupg.net
>
> ---------------------------------------------------------------------
> The official User-To-User support forum of the Apache HTTP Server Project.
> See <URL:http://httpd.apache.org/userslist.html> for more info.
> To unsubscribe, e-mail: users-unsubscr...@httpd.apache.org
>   "   from the digest: users-digest-unsubscr...@httpd.apache.org
> For additional commands, e-mail: users-h...@httpd.apache.org
>
>


-- 
Muito Obrigado

Ricardo

Reply via email to