# Libwww Architecture

Libwww is a general code base that can be used as a basis for building a large variety of World Wide Web applications. Its main purpose is to provide services to transmit data objects rendered in many different media types either to or from a remote server using the most common Internet access methods or the local file system. It provides plain C reference implementations of those specifications and is especially designed to be used on a large set of different platforms. Version 3.1 supports more than 20 Unix flavors, VMS, Windows NT, and ongoing work is being done to extend the set of platforms.

Even though plain C does not support an object oriented model but merely enables the concept, many of the data structures in the Library are derived from the class notation. This leads to situations where forced type casting is required in order to use a reference to a subclass where a superclass is expected. The forced type casting problem and inheritance in general would be solved if an object oriented programming language was to be used instead of C, but the current standardization and deployment level of object oriented languages in general would imply that a part of the portability would get lost in the transition. There are several intermediate solutions under consideration where one or more object oriented APIs built on top of the Library provides the application programmer with a cleaner interface.

Many of the features of libwww are demonstrated in the Line Mode Browser which is a text terminal client built right on top of the Library. Even though this application is usable as an independent Web application, its main purpose is to show a working example of how libwww can be used. However, it is important to note that the Line Mode Browser is only one way of using libwww and many other applications may want to use it in other ways.

The development of libwww was started by Tim Berners-Lee in 1990, and today the Library is a multi functional code base with a large amount of knowledge about network programming and portability built into it with help from Ari Luotonen, Jean-Francois Groff, Håkon W. Lie and a large number of people on the Internet.

## Design of Libwww Core

This section describes some of the design points behind the libwww core. The core is basically a registry where the application can register the set of features that the application needs.

- Basic Design Model
- Simplified Control Flow
- Data Flow Using Streams
- Input and Output Streams
- The Stream Builder
- The Request/Response Paradigm
- Before and After Filters
- Threads and Event Loops
- Protocol Modules as State machines