# SCGI for Perl 6 ## Introduction This is a simple SCGI library for Perl 6. It's main influences are the Perl 5 SCGI library, and the Perl 6 HTTP::Daemon library. It offers a bit of candy coating compared to the Perl 5 version. By default is uses a PSGI-compliant interface, but can also handle raw HTTP responses. You don't need to create your own IO::Socket::INET object. Just pass an 'addr' and 'port' attribute to the new() declaration and it'll create the object for you. ## Usage The simplest (and recommended) form of usage is to use the handle() method with PSGI-compliant output. Here's an example: ```perl use SCGI; my $scgi = SCGI.new( :port(8118) ); my $handler = sub (%env) { my $name = %env || 'world'; my $status = '200'; my @headers = 'Content-Type' => 'text/plain'; my @body = "Hello $name\n"; @headers.push: 'Content-Length' => @body.join.encode.bytes; return [ $status, \@headers, \@body ]; } $scgi.handle: $handler; ``` There are other ways of using SCGI, such as writing your own run loop, or using a raw HTTP output instead of PSGI. Here's an example doing both: ```perl use SCGI; my $scgi = SCGI.new( :port(8118), :!PSGI ); while (my $connection = $scgi.accept()) { my $request = $connection.request; if $request.success { my $name = $request.env || 'world'; my $return = "Hello $name\n"; my $len = $return.encode.bytes; my $headers = "Content-Type: text/plain\nContent-Length: $len\n"; $connection.send("$headers\n$return"); } $connection.close; } ``` Test script representing both examples can be found in the 'test' folder. If you are serious about using SCGI for web application development, see the [Perl 6 Web](https://github.com/supernovus/perl6-web/) library set, or one of the full blown frameworks built using it. ## Configuration ### nginx Make sure you compiled nginx with the SCGI plugin (it is included by default.) Then, in one of your server blocks, add a location mount: ```nginx location /scgi/ { scgi_pass 127.0.0.1:8118; include scgi_params; # Optionally rewrite document URI path rewrite ^/scgi/(.*) /$1 break; # Some applications may need rewritten URI in PATH_INFO scgi_param PATH_INFO $uri; } ``` ### lighttpd First, make sure the SCGI library is being loaded. ```lighttpd server.modules += ( "mod_scgi" ) ``` Next, set up an SCGI handler: ```lighttpd scgi.server = ( "/scgi" => (( "host" => "127.0.0.1", "port" => 8118, "check-local" => "disable" )) ) ``` ### Apache 2 with mod_scgi: Add the following line to your site config, changing the details to match your SCGI script configuration: ```apache SCGIMount /scgi/ 127.0.0.1:8118 ``` ### Apache 2 with mod_proxy_scgi: Add the following line to your site config, changes the details to match your SCGI script configuration: ```apache Order deny,allow Allow from all ProxyPass /scgi/ scgi://localhost:8118/ ``` ## Requirements * [HTTP::Status](https://github.com/supernovus/perl6-http-status) * [Netstring](https://github.com/supernovus/perl6-netstring) ## Author Timothy Totten, supernovus on #perl6, https://github.com/supernovus/ ## License Artistic License 2.0