diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e82a3aa --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,24 @@ +{ + "sqltools.connections": [ + { + "mysqlOptions": { + "authProtocol": "default" + }, + "previewLimit": 50, + "server": "localhost", + "port": 3306, + "driver": "MariaDB", + "name": "DockerLocal", + "database": "finance", + "username": "elex", + "password": "test" + }, + { + "previewLimit": 50, + "driver": "SQLite", + "name": "test", + "database": "${workspaceFolder:perl-examples}/test.db" + } + ], + "sqltools.useNodeRuntime": true +} \ No newline at end of file diff --git a/README.md b/README.md index 32cfc96..ddc4382 100644 --- a/README.md +++ b/README.md @@ -1 +1,17 @@ # Perl Examples + +## JSON +https://metacpan.org/pod/JSON + +```bash +sudo cpanm JSON +``` + +### decode_json +* pass a json string +* returns a reference to a hash + +### encode_json +* pass a reference to a hash +* returns a json string + diff --git a/src/cgi/Dockerfile b/src/cgi/Dockerfile new file mode 100644 index 0000000..f5098f1 --- /dev/null +++ b/src/cgi/Dockerfile @@ -0,0 +1,23 @@ +FROM nginx:latest + +RUN apt-get clean && \ +apt-get update && \ +apt-get install -y spawn-fcgi fcgiwrap wget curl cpanminus build-essential + +RUN cpanm JSON + +RUN sed -i 's/www-data/nginx/g' /etc/init.d/fcgiwrap + +RUN chown nginx:nginx /etc/init.d/fcgiwrap + +ADD ./vhost.conf /etc/nginx/conf.d/default.conf + +RUN apt-get clean && \ +rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +WORKDIR /var/www + +EXPOSE 80 + +CMD /etc/init.d/fcgiwrap start && \ +nginx -g 'daemon off;' diff --git a/src/cgi/cgi-bin/hello.pl b/src/cgi/cgi-bin/hello.pl new file mode 100755 index 0000000..b30b36c --- /dev/null +++ b/src/cgi/cgi-bin/hello.pl @@ -0,0 +1,51 @@ +#!/usr/bin/perl +use warnings; +use strict; +use JSON; + +my $buffer; +$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; +if ($ENV{'REQUEST_METHOD'} eq "GET") { + $buffer = $ENV{'QUERY_STRING'}; + my $params_ref = &parse_query($buffer); + + print "$ENV{SERVER_PROTOCOL} 200 OK\r\n"; + print "Content-type:text/plain\r\n"; + print "\r\n"; + print "Hello\n"; + + for my $key (keys %$params_ref) { + print "$key => $params_ref->{$key}\r\n"; + } + +} elsif ($ENV{'REQUEST_METHOD'} eq "POST") { + read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); + my $obj_ref = &parse_json_body($buffer); + + print "$ENV{SERVER_PROTOCOL} 200 OK\r\n"; + print "Server: $ENV{SERVER_SOFTWARE}\r\n"; + print "Content-type:application/json\r\n"; + print "\r\n"; + print &encode_json($obj_ref)."\r\n"; + print $obj_ref->{'name'}; + +} + +sub parse_json_body { + return &decode_json($_[0]); +} + +sub parse_query { + my %params; + my @pairs = split(/&/, $_[0]); + foreach my $pair (@pairs) { + my ($name, $value) = split(/=/, $pair); + $value =~ tr/+/ /; + $value =~ s/%(..)/pack("C", hex($1))/eg; + $params{$name} = $value; + } + return \%params; +} + +__END__ + diff --git a/src/cgi/index.html b/src/cgi/index.html new file mode 100644 index 0000000..31d3c91 --- /dev/null +++ b/src/cgi/index.html @@ -0,0 +1,9 @@ + + +
+Hello, world!
+ + \ No newline at end of file diff --git a/src/cgi/launcher.pl b/src/cgi/launcher.pl new file mode 100755 index 0000000..45fcf86 --- /dev/null +++ b/src/cgi/launcher.pl @@ -0,0 +1,28 @@ +#!/usr/bin/perl +use warnings; +use strict; + +my $name = 'perl-cgi'; +my $version = '1.0.2'; + +my $sh_build = <Hello, World!
+=end html +=cut \ No newline at end of file diff --git a/src/socket_client.pl b/src/socket_client.pl new file mode 100755 index 0000000..4df893c --- /dev/null +++ b/src/socket_client.pl @@ -0,0 +1,22 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Socket; + +my $port = 9999; +my $host = "localhost"; + +my $socket; +my $iaddr = inet_aton($host); +my $paddr = sockaddr_in($port, $iaddr); + +socket($socket, PF_INET, SOCK_STREAM, getprotobyname('tcp')); +connect($socket, $paddr) or die $!; + +my $line; +while ($line = <$socket>){ + print "$line\n"; +} +close $socket or die "close : $!"; + +exit(0); \ No newline at end of file diff --git a/src/socket_server.pl b/src/socket_server.pl new file mode 100755 index 0000000..1ceedd8 --- /dev/null +++ b/src/socket_server.pl @@ -0,0 +1,20 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Socket; + +my $port = 9999; + +my $server; +socket($server, PF_INET, SOCK_STREAM, getprotobyname('tcp')); +bind($server, sockaddr_in($port, INADDR_ANY)) or die $!; +listen($server, 10); +while(1){ + my $client; + my $paddr = accept($client, $server); + my ($port, $iaddr) = sockaddr_in($paddr); + my $name = gethostbyaddr($iaddr, AF_INET); + print $client "Smile from the server."; + print "Connection received from $name\n"; + close $client; +} \ No newline at end of file diff --git a/test.db b/test.db new file mode 100644 index 0000000..97f118d Binary files /dev/null and b/test.db differ