Do you know if Webmin works under Windows also? Teddy, Teddy's Center: http://teddy.fcc.ro/ Email: [EMAIL PROTECTED]
----- Original Message ----- From: "drieux" <[EMAIL PROTECTED]> To: "Joe Echavarria" <[EMAIL PROTECTED]> Cc: "cgi cgi-list" <[EMAIL PROTECTED]> Sent: Wednesday, February 12, 2003 2:35 AM Subject: Re: using http::Daemon and cgi On Tuesday, Feb 11, 2003, at 14:59 US/Pacific, Joe Echavarria wrote: > Hi there, > > I want to write a simple cgi application using > http::daemon. I want to write a cgi application > without installing a web server. Can i do that ?, can > anyone send me a simple code ?. Everything works fine > when i don't use a cgi script, i mean when i only use > html files, not perl scripts. I think what you are asking is how do I make a 'mini-web server' that will front end one or more cgi piece of code? It's not really that hard, and you're aiming in the right direction-ish with the http::daemon approach, the trick then becomes how to managing setting up the appropriate environment for the cgi scripts, and then resolving if you want to manage running more than one cgi script at a time.... hence if you are going to fork() yourself... The code itself is not really simple. I would highly recommend peeking at the webadmin tool set at: http://www.webmin.com/ ciao drieux --- an illustration - this code may not work, as i opted to do some major re-write about hot to get it to do what I wanted, but I think It will help you towards the idea. #!/usr/bin/perl -w use strict; # # the plot here is to generate a basic test Frame webServer # use HTTP::Daemon; use HTTP::Status; my $local_host = 'libex'; my $local_port = 12347; my $d = new HTTP::Daemon ( LocalAddr => $local_host , LocalPort => $local_port , Reuse => 1 ); die "unable to new daemon\n" unless($d); my $main_fileno = $d->fileno ; print "Please contact me at: <URL: ", $d->url, " > we are on $main_fileno\n"; open(STDIN, "</dev/null"); open(STDOUT, ">/dev/null"); # # here we go into our main processing loop # our $c; # for our $c the socket $SIG{'TERM'} = sub { if ($c) { $c->shutdown(2); $c->close; }}; $SIG{'__DIE__'} = sub { if ($c) { $c->shutdown(2); $c->close; } }; my ( @childpids, $rmask, @passin, @passout ); while ($c = $d->accept) { while (my $r = $c->get_request) { my $path = $r->url->path ; my $url = $r->uri ; my $method = $r->method ; my $qstring = $r->uri->query ; my $content = ${$r->content_ref}; my $iaddr = $c->peeraddr ; my $peer = gethostbyaddr($iaddr, AF_INET); print STDERR "handed request: $path and $url \n"; print STDERR " we got content <$content>\n" if($content); print STDERR " we got qstring <$qstring>\n" if($qstring); if ($method eq 'GET' && $path =~ /^\/$/ ) { $c->send_file_response("../docs/hello.html"); } elsif ( -f "../docs${path}" ) { $c->send_file_response("../docs${path}"); } elsif ( -f "../cgi_bin${path}" ) { # # we know it is something we can invoke # let us just cope with the game now # handle_request($r, $c); } else { $c->send_error(RC_NOT_FOUND) } undef($r); } $c->shutdown(2); $c->close; undef($c); } #------------------------ # sub handle_request { my ($req, $caller) = @_; my $cgipid = -1; my $posted_data; my $queryargs; my $scriptname; my $meth = $req->method ; my $path = $req->url->path ; ($scriptname = $path ) =~ s/\/// ; my $uri = $req->url ; my $full = "./$scriptname"; if ( $meth eq 'POST' ) { # # we need to pull this out for the fun filled folks. # $ENV{'CONTENT_LENGTH'} = $req->content_length; $posted_data = $req->content(); #$posted_data =~ s/&/ /g ; } if ( $meth eq 'GET' ) { #$queryargs = $req->url $queryargs = $req->uri->query ; $queryargs ||= ' '; #$queryargs =~ s/&/ /g ; } $queryargs ||= $posted_data; $ENV{'QUERY_STRING'} = $queryargs ; $ENV{'CONTENT_TYPE'} = $req->content_type; $ENV{"PWD"} = "../cgi_bin"; $ENV{"REQUEST_METHOD"} = $meth; $ENV{"SCRIPT_NAME"} = $scriptname; $ENV{"REQUEST_URI"} = $uri; # # borrowing the webMin fork cgi model # pipe(CGIINr, CGIINw); pipe(CGIOUTr, CGIOUTw); #pipe(CGIERRr, CGIERRw); if (!($cgipid = fork())) { chdir($ENV{"PWD"}); open(STDIN, "<&CGIINr"); open(STDOUT, ">&CGIOUTw"); #open(STDERR, ">&CGIERRw"); close(CGIINw); close(CGIOUTr); #close(CGIERRr); exec($full, split(/\s+/, $queryargs)); exit; } print STDERR "calling $full \n"; close(CGIINr); close(CGIOUTw); #close(CGIERRw); # # send in the posted data if ( $posted_data ) { print CGIINw $posted_data; } close(CGIINw); $caller->shutdown(0); select(CGIOUTr); $|=1; select(STDOUT); # # we read their phoo and woof it through # my $line; while($line = <CGIOUTr>) { $caller->print( $line ); } #print STDERR "make it out OK\n"; close(CGIOUTr); #close(CGIERRr); } # end of handle_request if nothing else it will give you a feel for what needs to be done. -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
