- Deepening the concepts related to working with sockets.
- Developing skills in implementing and designing applications that use asynchronous operations and other advanced I/O operations.
- Deepening the use of the API for advanced I/O operations in the Linux operating system.
Implement a web server that uses the following advanced I/O operations:
- Asynchronous operations on files
- Non-blocking operations on sockets
- Zero-copying
- Multiplexing I/O operations
The server implements a limited functionality of the HTTP protocol: passing files to clients.
The web server will use the multiplexing API to wait for connections from clients - epoll. On the established connections, requests from clients will be received and then responses will be distributed to them.
The server will serve files from the AWS_DOCUMENT_ROOT directory, defined within the assignments' header.
Files are only found in subdirectories AWS_DOCUMENT_ROOT/static/ and AWS_DOCUMENT_ROOT/dynamic/.
The corresponding request paths will be, for example, AWS_DOCUMENT_ROOT/static/test.dat and AWS_DOCUMENT_ROOT/dynamic/test.dat.
The file processing will be:
- The files in the
AWS_DOCUMENT_ROOT/static/directory are static files that will be transmitted to clients using the zero-copying API - sendfile - Files in the
AWS_DOCUMENT_ROOT/dynamic/directory are files that are supposed to require a server-side post-processing phase. These files will be read from disk using the asynchronous API and then pushed to the clients. Streaming will use non-blocking sockets (Linux) - An HTTP 404 message will be sent for invalid request paths
After transmitting a file, according to the HTTP protocol, the connection is closed.
- Implementing the assignment requires having a state machine for each connection, which you periodically query and update as the transfer proceeds.
Check the
connection_statedata structure defined in the assignment header. - Find the
connectiondata structure defined in the assignment header. This can be used to keep track of an open connection. - Definitions of other useful macros and data structures can be found in the assignment header.
- HTTP responses will have the code
200for existing files and404for not existing files.- A valid response consists of the HTTP header, containing the related directives, two newlines (
\r\n\r\n), followed by the actual content (the file). - Sample answers can be found in the parser test file or in the provided sample.
- You can use predefined request directives such as
Date,Last-Modified, etc.- The
Content-Lengthdirective must specify the size of the HTTP content (actual data) in bytes. - The
Connectiondirective must be initialized toclose.
- The
- A valid response consists of the HTTP header, containing the related directives, two newlines (
- The port on which the web server listens for connections is defined within the assignment header: the
AWS_LISTEN_PORTmacro. - The root directory relative to which the resources/files are searched is defined within the assignment header as the
AWS_DOCUMENT_ROOTmacro.
The clients and server will communicate using the HTTP protocol. For parsing HTTP requests from clients we recommend using this HTTP parser, also available in the assignments' http-parser. You will need to use a callback to get the path to the local resource requested by the client. Find a simplified example of using the parser in the samples directory.
Logs are collected in test.log and wget.log files.