Lecture 15
CGI SessionsPerl
CPE 401 / 601Computer Network Systems
slides are modified from Dave Hollinger and Shwen Ho
Sessions
Many web sites allow you to establish a session.
you identify yourself to the system.
now you can visit lots of pages, add stuff to shopping cart, establish preferences, etc.
CGI Sessions 2
State Information
Remember that each HTTP request is unrelated to any other as far as the Web server is concerned
Each new request to a CGI program starts up a brand new copy of the CGI program.
Providing sessions requires keeping state information.
CGI Sessions 3
Session Conversation
CGI Sessions 4
Client
Client
Hi! I'm Joe.Hi! I'm Joe. Server
Server
Hi Joe (it's him again)Welcome Back...Hi Joe (it's him again)Welcome Back...
I wanna buy a cookie.I wanna buy a cookie.
OK Joe, it will be there tomorrow.OK Joe, it will be there tomorrow.
CGI1
CGI2
Hidden Field Usage
One way to propagate state information is to use hidden fields.
User identifies themselves to a CGI program fills out a form
CGI sends back a form that contains hidden fields that identify the user or session.
CGI Sessions 5
Revised Conversation
Initial form has field for user name.
GET /cgi1?name=joe HTTP/1.0
CGI1 creates order form with hidden field.
GET/cgi2?name=joe&order=cookie HTTP/1.0
CGI Sessions 6
Session Keys
Many Web based systems use hidden fields that identify a session.
When the first request arrives, the system generates a unique session key and stores it in a database.
The session key can be included in all forms/links generated by the system as a hidden field or embedded in a link
CGI Sessions 7
Session Key Properties
Must be unique.
Should expire after a while.
Should be difficult to predict. typically use a pseudo-random number
generator seeded carefully.
CGI Sessions 8
Pizza Server Session Keys
We define a server to use session keys: <INPUT TYPE=HIDDEN NAME=sessionkey VALUE=HungryStudent971890237>
A request to order a pizza might look like this all on one line
GET /pizza.cgi?sessionkey= HungryStudent971890237&pizza=cheese&size=large HTTP/1.0
CGI Sessions 9
HTTP Cookies
A "cookie' is a name,value pair that a CGI program can ask the client to remember.
The client sends this name,value pair along with every request to the CGI.
We can also use "cookies" to propagate state information.
CGI Sessions 10
Cookies are HTTP
Cookies are HTTP headers.
A server (CGI) can give the browser a cookie by sending a Set-Cookie header line with the response.
A client can send back a cookie by sending a Cookie header line with the request.
CGI Sessions 11
Set-Cookie Header Options
The general form of the Set-Cookie header is:
Set-Cookie: name=value; options
The options include:expires=...
domain=...
path=...
CGI Sessions 12
Setting a cookie
HTTP/1.0 200 OK
Content-Type: text/html
Set-Cookie: customerid=0192825
Content-Length: 12345
...
CGI Sessions 13
expires Option
This tells the browser how long to hang on to the cookie.
The time/date format is very specific!
CGI Sessions 14
expires=Friday 29-Feb-2000 00:00:00 GMT
Weekday, Day-Month-Year Hour:Minute:Second GMT
Default expiration
If there is no expires option on the Set-Cookie header line, the browser does not save the cookie to
disk.
In this case, when the browser is closed it will forget about the cookie.
CGI Sessions 15
domain Option
domain=.unr.edu
The domain option tells the browser the domain(s) to which it should send the cookie.
Domains as in DNS.
The domain must start with "." and contain at least one additional "."
CGI Sessions 16
Domain option rules
The server that sends the Set-Cookie header must be in the domain specified.
If no domain option is in the header, the cookie will only be sent to the same server.
: CGI Sessions 17
Default Behavior
path Option
path=/
or path=/~mgunes/cpe401
The path option tells the browser what URLs the cookie should be sent to.
CGI Sessions 18
path default
If no path is specified in the header, the cookie is sent to only those URLs that
have the same path as the URL that set the cookie.
A path is the leading part of the URL does not include the filename
CGI Sessions 19
Default Path Example
If the cookie is sent from:
/~mgunes/cpe401/pizza/pizza.cgi
it would also be sent to
/~mgunes/cpe401/pizza/blah.cgi
but not to
/~mgunes/cpe401/soda/pizza.cgi
CGI Sessions 20
Set-Cookie Fields
Many options can be specified. Things are separated by ";"
Set-Cookie: a=blah; path=/; domain=.cse.unrr.edu; expires=Thursday, 21-Feb-2002 12:41:07 2002
CGI Sessions 21
All must b
e on one li
ne!
CGI cookie creation
A CGI program can send back any number of HTTP headers. can set multiple cookies
Content-Type is required!
Blank line ends the headers!
CGI Sessions 22
C Example
printf("Content-Type: text/html\r\n");
printf("Set-Cookie: prefs=nofrms\r\n");
printf("Set-Cookie: Java=yes\r\n");
printf("\r\n");
… now sends document content
CGI Sessions 23
Getting HTTP Cookies
The browser sends each cookie as a header:
Cookie: prefs=nofrms
Cookie: Java=OK
The Web server gives the cookies to the CGI program via an environment variable.
CGI Sessions 24
Multiple Cookies
There can be more than one cookie. The Web Server puts them all together
like this:prefs=nofrms; Java=OK
and puts this string in the environment variable: HTTP_COOKIE
CGI Sessions 25
Cookie Limits
Each cookie can be up to 4k bytes.
One "site" can store up to 20 cookies on a user's machine.
CGI Sessions 26
Cookie Usage
Create a session.
Track user browsing behavior.
Keep track of user preferences.
Avoid logins.
CGI Sessions 27
Cookies and Privacy
Cookies can't be used to: send personal information to a web server
without the user knowing about it.
be used to send viruses to a browser.
find out what other web sites a user has visited.*
access a user's hard disk
* although they can come pretty close to this one!
CGI Sessions 28
Some Issues
Persistent cookies take up space on user's hard disk.
Can be used to track your behavior within a web site. This information can be sold or shared.
Cookies can be shared by cooperating sites advertising agencies do this.
CGI Sessions 29
PerlPractical Extration and Reporting Language a high-level programming language
• whose semantics are largely based on C
Designed for text manipulation Very fast to implement particularly strong at process, file and text
manipulation
Runs on many different platform Windows, Mac, Unix, Linux, Dos, etc
Perl 31
Running Perl Perl scripts do not need to be compiled
interpreted at the point of execution do not necessarily have a particular file
extension • “.pl” is used commonly
Executing it via the command line command line> perl script.pl arg1 arg2 ... Or add the line "#!/usr/bin/perl" to the start
of the script if you are using unix/linux./perlscript.pl
• Remember to set the correct file execution permissions before running it
Perl 32
Beginning Perl Every statement end with a semi colon ";"
Comments are prefixed at the start of the line with a hash "#"
Variables are assigned a value using the "="
Variables are not statically typed, No need to declare what kind of data you want to hold
in them.
Variables are declared the first time you initialize them and they can be anywhere in the program.
Perl 33
Scalar Variables Contains single piece of data '$' character shows that a variable is
scalar Scalar variables can store
number string
• a chunk of text surrounded by quotes
$name = "paul"; $year = 1980;print "$name is born in $year";
output: paul is born in 1980Perl 34
Arrays Variables (List) Ordered list of data, separated by commas '@' character shows that a variable is an
array
Array of numbers@year_of_birth = (1980, 1975, 1999);
Array of string@name = ("Paul", "Jake", "Tom");
Array of both string and numbers@paul_address = (14,"Cleveland St","NSW",2030);
Perl 35
Retrieving data from Arrays Printing Arrays
@name = ("Paul", "Jake", "Tom");print "@name";
Accessing individual elements in an array@name = ("Paul", "Jake", "Tom");print "$name[1]";
What has changed? @name to $name To access individual elements use the syntax $array[index]
Why did $name[1] print the second element? index 0 represents the first element.
Perl 36
Arrays …
@name = ("Paul", "Jake", "Tom");
print "@name"; Paul Jake Tom
print @name; PaulJakeTom
$count=@name; $count = 3
@nameR=reverse(@name); @nameR=("Tom","Jake","Paul")
@nameS=sort(@name); @nameS=("Jake","Paul","Tom")
Perl 37
Basic Arithmetic Operators
+ Addition - Subtraction * multiplication / division ++ adding one to the variable -- subtracting one from the
variable$a += 2 incrementing variable by 2$b *= 3 tripling the value of the
variablePerl 38
Relational Operators
Comparison NumericString
Equals == eqNot equal != neLess than < lt
Greater than > gtLess than or equal <= le
Greater than or equal >= gtComparison <=> cmp
Perl 39
Iteration Structures
while (CONDITION) { BLOCK }
until (CONDITION) {BLOCK}
do {BLOCK} while (CONDITION)
for (INITIALIZATION ; CONDITION ;
Re-INITIALIZATION) {BLOCK}
foreach VAR (LIST) {BLOCK}
for VAR (LIST) {BLOCK}
Perl 41
Iteration Structures
$i = 1;while($i <= 5){ print "$i\n"; $i++;}
for($x=1; $x <=5; $x++) { print "$x\n";}
@array = [1,2,3,4,5];foreach $number (@array){ print "$number\n";}
Perl 42
String Operations Strings can be concatenated with the dot operator$lastname = "Harrison";$firstname = "Paul";$name = $firstname . $lastname;$name = "$firstname$lastname";
Comparison can be done with the relational operator
$string1 = "hello";$string2 = "hello";if ($string1 eq $string2) { print "they are equal"; }else { print "they are different"; } Perl 43
String comparison using patterns The ‘=~ ’ operator return true if the pattern
within the ‘/’ quotes are found. $string1 = "HELLO";$string2 = "Hi there";# test if the string contains the pattern EL
if ($string1 =~ /EL/) { print "This string contains the pattern"; }else { print "No pattern found"; }
Perl 44
Functions in Perl No strict variable type restriction during
function call Perl has provided lots of useful functions
chop - remove the first character of a string chomp - remove the carriage return
character from the end of a string push - append one or more element into an
array pop - remove the last element of an array and
return it shift - remove the first element of an array and
return it s - replace a pattern with a string Perl 45
Functions in Perl The "split" function breaks a given
string into individual segments given a delimiter
split( /pattern/, string) returns a list
@output = split (/\s/, $string); # breaks the sentence into words
@output = split (//, $string); # breaks the sentence into single characters
@output = split (/,/, $string); # breaks the sentence into chunks separated by a
comma.
join ( /delimiter/, array) returns a stringPerl 46
Executing functions in Perl Function arguments are stored automatically in
a temporary array called @_
sub sayHelloto { @name = @_; $count = @_; foreach $person (@name){ print "Hello $person\n"; } return $count;}@array = ("Paul", "Jake", "Tom");sayHelloto(@array);sayHelloto("Mary", "Jane", "Tylor", 1, 2, 3);
Perl 48
Input / Output
Perl allows you to read in any input that is automatically sent to your program via standard input by using the handle <STDIN>.
Other I/O topics include reading and writing to files, Standard Error (STDERR) and Standard Output (STDOUT).
One way of handling inputs via <STDIN> is to use a loop to process every line of input
Perl 49
Input / Output Count the number of lines from standard
input and print the line number together with the 1st
word of each line.
$count = 1;foreach $line (<STDIN>){ @array = split(/\s/, $line); print "$count $array[0]\n"; $count++;}
Perl 50
Regular Expression
Regular expression is a set of characters that specify a pattern.
Used for locating piece of text in a file.
Regular expression syntax allows the user to do a "wildcard" type search without necessarily specifying the character literally
Available across OS platform and programming language.
Perl 51
A simple regular expression contains the exact string to match
$string = "aaaabbbbccc";if($string =~ /bc/){ print "found pattern\n";}
output: found pattern
Simple Regular Expression
Perl 52
Simple Regular Expression
The variable ‘$& ’ is automatically set to the matched pattern
$string = "aaaabbbbccc";if($string =~ /bc/){ print "found pattern : $&\n"; }
output: found pattern bc
Perl 53
Simple Regular Expression
What happen when you want to match a generalised pattern like an "a" followed by some "b"s and a single "c"
$string = "aaaabbbbccc";if($string =~ /abbc/){ print "found pattern : $&\n"; }else {print "nothing found\n"; }
output: nothing found
Perl 54
Regular Expression - Quantifiers We can specify the number of times we want
to see a specific character in a regular expression by adding operators behind the character.
‘ * ’ (asterisk) matches zero or more copies of a specific character
‘ + ’ (plus) matches one or more copies of a specific character
Perl 55
Regular Expression - Quantifiers@array = ["ac", "abc", "abbc", "abbbc", "abb", "bbc", "bcf", "abbb", "c"];
foreach $string (@array){ if($string =~ /ab*c/){ print "$string "; }}
output: ac abc abbc abbbc
Perl 56
Regular Expression - Quantifiers
Regular Exp
Matched pattern
abc abc
ab*c ac abc abbc abbbc
ab+c abc abbc abbbc
@array = ["ac", "abc", "abbc", "abbbc", "abb", "bbc", "bcf", "abbb", "c"];
Perl 57
Regular Expression - Anchors
Anchor restrictions preceding and behind the pattern specify where along the string to match to.
‘^’ indicates a beginning of a line restriction
‘$’ indicates an end of line restriction
Perl 58
Regular Expression - Anchors
Regular Exp
Matched pattern
^bc bc
^b*c bbc bcf c
^b*c$ bbc c
b*c$ ac abc abbc abbbc bbc c
@array = ["ac", "abc", "abbc", "abbbc", "abb", "bbc", "bcf", "abbb", "c"];
Perl 59
Regular Expression - Range […] is used to identify the exact characters
you are searching for
[0123456789] will match a single numeric character
[0-9] will also match a single numeric character
[A-Za-z] will match a single alphabet of any case
Perl 60
Regular Expression - Range Search for a word that
starts with the uppercase T second letter is a lowercase alphabet third letter is a lower case vowel is 3 letters long followed by a space
Regular expression : "^T[a-z][aeiou] "
Note : [z-a] is backwards and does not work Note : [A-z] does match upper and lowercase but
also 6 additional characters between the upper and lower case letters in the ASCII chart: [ \ ] ^ _ `
Perl 61
Regular Expression - Others Match a single character (non specific) with "." (dot)
a.c matches any string with "a" follow by one character
and followed by "c"
Specifying number of repetition sets with "\{" and "\}“ [a-z]\{4,6\}
match four, five or six lower case alphabet
Remembering Patterns with "\(,\)" and "\1" Regular Exp allows you to remember and recall patterns
Perl 62
RegExp problem and strategies You tend to match more lines than desired.
A.*B matches AAB as well as AAAAAAACCCAABBBBAABBB
Knowing what you want to match Knowing what you don’t want to match
Writing a pattern out to describe that you want to match
Testing the pattern
Perl 63
Web Servers & CGI
Most web server are capable of running CGI programs.
The server must be able to determine whether a URI refers to: Document
• just send it back CGI program
• run it and send back the result.
CGI … 65
CGI recognition Some servers insist that CGI programs be
in a special place typically the URL path is one of:
/CGI-BIN /cgi-bin /CGI /cgibin
Some servers look at the filename: filename ends with .cgi
Some servers are given a list of URLS that are CGIs
66CGI …
User files and Web Servers
On Unix based web servers, the URL/~username
is typically mapped to the directory~username/public.html
-or-~username/public_html
67CGI …
www.cse.unr.edu
On the CSE web server you should put your files in ~/public.html
The URI http://www.cse.unr.edu/~you
is your home page where you is your CSE username.
68CGI …
Directories
Most web servers do the following when a URL maps to a directory:
if there is a file named index.html in the directory
• it is sent back.
if there is no index.html, • an HTML formatted directory listing is sent back.
69CGI …
Debugging
It's hard to debug a CGI program!
Debugging print statements should generate HTML.
You can run the program from the Unix command line you just need to set the environment variables
right (use GET for this).
70CGI …
<HTML>
<HEAD>
<TITLE>cgi-test</TITLE>
</HEAD>
<BODY>
<p> This is a sample page to read
two data items from the web page:
<form action="cgi-bin/xaction" method=get>
<p>First name=<input type=text name=xfirst size=10>
<br>Last name=<input type=text name=xlast size=20>
<br> <input type=submit value=SEND>
<input type=reset value=RESET>
</form>
</BODY>
</HTML>
Parameters passed as arguments xfirst and xlast
HTML for Forms
Perl 72
Perl - CGI script#!/usr/bin/perl
print “Content-Type: text/html\n\n”;
print “<html><head>\n”;
print “<title>Sample PERL script</title>\n”;
print “</head><body>\n”;
print “<p>Query_string is $ENV{'QUERY_STRING'}\n”;
foreach ( split( /&/, $ENV{'QUERY_STRING'}) )
{ ( $key, $val ) = split( /=/, $_, 2 );
$tmp{$key} = $val; }
print “<p>First name is <b>$tmp{'xfirst'}</b>\n”;
print “<p>Last name is <b>$tmp{'xlast'}</b>\n”;
print “</body></html>\n”
Perl 73
• Perl program first reads parameters as xfirst&zlast from $ENV (environment) into QUERY_STRING• Output of Perl is the syntax of an HTML page that is displayed
Top Related