Fun Fun Project One Building Your Very Own Web Server 1

advertisement
Fun Fun Project One
Building Your Very Own Web
Server
Fun Fun Project One
1
What is a Web Server?

Program that understands the HTTP
protocol and generates appropriate
responses




Clients “connect” to the machine
Clients send a “request”
Server reads request, generates “response”
Client interprets response appropriately
Fun Fun Project One
2
A Simplified Web Server
Client asks for file
 Server finds appropriate file
 Server sends back a response header
followed by the file’s data
 Server closes connection

Fun Fun Project One
3
What Does Connect Mean?

For all practical purposes, it looks like
there’s data available via a file
descriptor




Stream of bytes
Can be treated like any other file descriptor
Not a FILE * (like stdio, stderr)
Must use read() and write() system calls
Fun Fun Project One
4
How Do You Identify Machines
Names or numbers and ports
 http://www.domain.com implies a
machine named www.domain.com and
a default port of 80
 http://127.0.0.1:31415/index.html




Refers to current box (127.0.0.1 is me)
Port # is 31415 (used for this project)
File is named index.html
Fun Fun Project One
5
How Do You Identify Files?
File name is specified in request
 Server maps that name to a real file



Mapping can be whatever server wants
For example, /~vivek/index.html is
really
/n/fs/fac/vivek/public_html/index.html
Fun Fun Project One
6
What’s In A Request?
GET /index.html HTTP/1.0\r\n
Connection: Keep-Alive\r\n
User-Agent: Mozilla/4.72 [en] (X11..)\r\n
Host: 127.0.0.1:31415\r\n
Accept: image/gif, image/jpeg, */*\r\n
Accept-Encoding: gzip\r\n
Accept-Language: en\r\n
Accept-Charset: iso-8859-1,*,utf-8\r\n
\r\n
Fun Fun Project One
7
What Do You Care About?
GET /index.html HTTP/1.0
In particular, just index.html
Assume “/” means “/index.html”
Fun Fun Project One
8
What Could They Want?
An honest-to-goodness file (me.jpg)
 An indirect request for such a file (such
as “/” meaning index.html)
 An implied directory with index
(/home/vivek instead of /home/vivek/)
 Just a directory listing
 A query (we don’t care about these)
 An invalid/nonexistent file

Fun Fun Project One
9
What’s In A Response?
HTTP/1.0 200 OK\r\n
Date: blah-blah-blah\r\n
Server: blah-blah-blah\r\n
Content-Type: important\r\n
Last-Modified: blah-blah-blah\r\n
\r\n
Raw data
Fun Fun Project One
10
What’s a Minimal Response?
HTTP/1.0 200 OK\r\n
Content-Type: stuff\r\n
\r\n
Data
HTTP/1.0 302 Moved\r\n
Location: newurl\r\n
\r\n
HTTP/1.0 404 Not Found\r\n
\r\n
But also
Connection: close\r\n
Content-Length: yyy\r\n
Fun Fun Project One
11
How Do You Decide?
File exists? Send it
 Directory without “/” suffix? Redirect
 Directory with index.html? Send it
 Directory with no index.html? List it



For each list entry, add “/” if needed
Failure? Send 404
Fun Fun Project One
12
How Do You Test It?
Use a browser
 Use “wget” or create hierarchy
 Include some big images

Fun Fun Project One
13
What is Content-Type?
text/html
image/gif
image/jpeg
Others not needed
Fun Fun Project One
14
Where Can I Find More?
Google: HTTP 1.1 Specification - painful
man pages
man man
man –k blah
read( ), write( ), open( ), close( )
Fun Fun Project One
15
Why open instead of fopen?
Compare fopen, fread, etc., with open,
read, etc
 We’re dealing with functions closer to
the OS – easier to use in some cases
 Practice

Fun Fun Project One
16
What’s a File Descriptor?

Sort of like a FILE *




It’s an integer provided by OS
Used to represent a stream of bytes
Can represent file or network connection
Behavior is slightly different

Especially when reading/writing network
Fun Fun Project One
17
General Steps
Setup, and then
 Get next connection
 If file, read from disk
 If directory, generate listing
 Send all to client
 Close connection, wait for next one
Fun Fun Project One
18
What Am I Given?

Setup function


Accept function


Gets a connection from a client
File type function



Makes server available for connections
Tells you what kind of file, if it exists
Tells you how many bytes if a regular file
Directory listing functions

Gives you the file names one at a time
Fun Fun Project One
19
Help! I’m Lost!

Don’t know HTML?




Use Netscape composer to see what to do
View page source for various pages
Do “telnet www.domain.com 80” and issue
the GET manually (need to add “Host:
www.domain.com” header)
Ask
Fun Fun Project One
20
Why Are We Doing This?
Infrastructure for future projects
 Some OS/Networking interaction
 It’s fun, and not too bad

Fun Fun Project One
21
Download