Skip to content

Instantly share code, notes, and snippets.

@torgerson
Created December 8, 2009 08:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save torgerson/251508 to your computer and use it in GitHub Desktop.
Save torgerson/251508 to your computer and use it in GitHub Desktop.
#summary One-sentence summary of this page.
= Introduction =
Adding this in since this does not contain the code.
= Details =
#!/usr/bin/perl -w
# Jeff Torgerson
# chee-Z WebServer
# TODO:
# [] parse parameters
# [] pass arguments to web pages, and regex replace the values
# [] config for base directory, port, etc
use strict;
use IO::Socket;
use Time::Local;
#####################
# declarations
#####################
my ($client,$cheezServer,$count,$jCount,$linenumber,$line,$logfile,$fileToServe,$ourMsg,$time,$timestamp,$fnf,$year);
my (@date,@info,@lines,@ln);
#####################
## Settings
#####################
$logfile = "chee-z_webserver.log";
#####################
# main
#####################
$cheezServer = IO::Socket::INET->new
(
LocalPort => 80,
Type => SOCK_STREAM,
Reuse => 1,
Listen => 5 # number of clients to allow
) or die "Could not open your dumb server.. es ist kaput!";
# Now, wait for a connection
while ($client = $cheezServer->accept()) {
# $client->autoflush(1);
my $request = <$client>; # Get the first line
# right below here i get strange error on command line hits
# Use of uninitialized value in pattern match (m//) at E:\scripts\webserver.pl line 40.
if ($request =~ m|^GET /(.+)HTTP/1.[01]|) { # this must match a valid http request
my $theActualFile = stripParams($1); # I need to get rid of the params passed
# writeLogFile("debug","$theActualFile");# This allows me to throw a debug msg into the log file
if (-e $theActualFile) { # does the file exist
print $client "HTTP/1.0 200 OK\nContent-Type: text/html\n\n"; # Start serving my request
open($fileToServe,"<$theActualFile") or die "Can't open file: $theActualFile";
while(<$fileToServe>) { print $client $_ };
# now write the log file
writeLogFile("200","$1");
} else {
# we have a file not found if we get here, 404 error
$fnf = notFound("$theActualFile");
print $client $fnf; # writes the not found page
}
} else {
# we did not get a valid request
print $client "HTTP/1.0 400 BAD REQUEST\n";
print $client "Content-Type: text/plain\n\n";
print $client "BAD REQUEST\n";
}
close $client;
}
# now, close the server
close($cheezServer);
############################################################
## Subroutines
############################################################
##############################
## 404 errors here
sub notFound{
my $theFile = $_[0];
$ourMsg = "HTTP/1.0 404 FILE NOT FOUND\n";
$ourMsg = $ourMsg."Content-Type: text/html\n\n";
$ourMsg = $ourMsg."<h2>404 - File Not found</h2><b>".$theFile."</b> not found\n";
writeLogFile("404","$theFile");
return $ourMsg;
}
##############################
## Write my log file
sub writeLogFile{
my $httpStatusCode = $_[0];
my $entry = $_[1];
# now, open the log file
open(cheeZjournal,">>$logfile" ) || die "Could not open journal"; # Open the file
@lines = <cheeZjournal>;
@info = stat cheeZjournal;
@date = localtime($info[9]);
$year = sprintf("%d-%d-%d",$date[4]+1,$date[3],$date[5]+1900);
$time = "$date[2]:$date[1]"; # goofy error here when time is 7:03, I get 7:3
$timestamp = "$year|$time||$info[9]||";
$linenumber = $count;
print cheeZjournal "$httpStatusCode|$timestamp|$entry\n";
close(cheeZjournal) ; # Close the file
print @lines;
}
##############################
## Strip all the parameters
## off the file name for use
sub stripParams{
my @request;
my $fullStuff = $_[0];
# split on the Q to get only the file name
@request = split(/\?/,$fullStuff);
return $request[0]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment