Sockets and Pipes
Sockets and Pipes
Connect with Haskell
About the Book
The content that eventually grew into this book began with the question: What exactly is a web server? A satisfactory answer that does not assume substantial background knowledge requires spanning quite a few areas of computing. Fortunately, they all serve as fruitful motivations for simultaneously learning about how to use Haskell, which is the larger objective of the Joy of Haskell collection.
The language a web server speaks is the Hypertext Transfer Protocol (HTTP), which this book explores in great detail while walking through the creation of a server from "scratch". We encourage readers to follow along in reading the official definition of HTTP (RFC 7230 published by the Internet Engineering Task Force) as we implement the specification in Haskell. While high-level libraries make it possible to create web applications without detailed knowledge of HTTP, we believe that a full understanding of the underlying layers we build upon helps us use a platform more effectively. By studying HTTP we also gain an appreciation for what it is and is not good for, and for what applications we might stand to benefit from choosing a different network protocol instead.
Prerequisites
This book is for Haskell learners who have some basic faculty with the language and are now ready to work up to a substantial project. We expect that you understand the basic syntax and can do things like:
- write a
case
expression to pattern match over a sum type - sequence
IO
actions in ado
block - use qualified imports
- define datatypes
- use GHCi
- install Haskell libraries
From the base
package, we assume some familiarity with:
- types
Maybe
,Either
, and[]
- classes
Eq
,Show
,Monoid
,Foldable
,Functor
, andMonad
We do not assume prior knowledge of any additional libraries or GHC language extensions.
What's inside
Bytes and characters - The first several chapters introduce the bytestring
and text
libraries and are largely dedicated to tearing apart a traditional hello world program, looking underneath the abstract notion of "printing text" to start greeting the world in terms of writing bytes to a file handle. After discussing bytes, we need only a short hop to sockets, our means of writing bytes across great distances using the network
library.
Encoding and parsers - First we encoding HTTP messages as byte strings. That's the easy part; next, we go in the opposite direction and learn how to interpret byte strings using the attoparsec
library. This will acquaint us even more closely with the HTTP message format.
Monad transformers - We introduce three Monad transformers that are especially applicable to our subject matter: ResourceT
, ListT
, and ExceptT
. No prior experience with transformers is required. We do not linger on the general concept, preferring instead to focus on each of the three examples and to create familiarity with transformers and lifting chiefly by demonstration.
Resource safety - Use of ResourceT
begins in chapter 1, and we use it throughout the book. This makes it a breeze to deal with files and sockets without resource leaks.
Streaming - To move past toy examples that fit easily into memory, we have to start writing streaming processes that can deal with large amounts of data by handling it in smaller pieces. All of the code within this book is written with memory usage in mind. ListT
, the subject of chapter 12, provides an especially convenient facility for working with streams.
Error handling - As the amount of functionality of our server builds up, the number of possible error conditions starts to rise. Chapter 14 introduces ExceptT
to work with errors in a clean and well-typed manner.
Table of Contents
- 1 - Handles
- The necessity of indirection
- Writing to a file
- Diligent cleanup
- MonadIO
- Exercises
- 2 - Chunks
- Packed characters
- Reading from a file, one chunk at a time
- Exercises
- 3 - Bytes
- Packed octets
- Copying a file
- Character encodings
- The Show and IsString classes
- Avoiding system defaults
- Exercises
- 4 - Sockets
- Open up and connect
- Extra details
- Names and addresses
- Address information
- Exercises
- 5 - HTTP
- The specification
- HTTP requests
- ASCII strings
- HTTP responses
- Serving others
- Exercises
- 6 - HTTP types
- Request and response
- Request line
- Status line
- Header fields
- Message body
- HTTP version
- Exercises
- 7 - Encoding
- String builders
- Measuring time
- Request and response
- Higher-order encodings
- The start line
- Exercises
- 8 - Responding
- A measure of success
- Response-building utilities
- Integers
- Response transmission
- Exercises
- 9 - Content types
- Some common types
- UTF-8
- HTML
- JSON
- Exercises
- 10 - Change
- STM
- Increment
- Atomically
- The counting server
- Other STM topics
- Exercises
- 11 - Streaming
- Chunked hello
- Chunk types
- Encoding a chunk
- Transfer-Encoding
- Serving the file
- Exercises
- 12 - ListT IO
- The new response type
- What is ListT
- Constructing a response
- Encoding a response
- Sending a response
- ListT in other libraries
- Exercises
- 13 - Parsing
- Encoding vs decoding
- Attoparsec
- Request line
- Explaining what's wrong
- Incremental parsing
- Exercises
- 14 - Errors
- Status codes
- Constructing responses
- Visibility in two places
- Thread-safe logging
- Either
- ExceptT
- Exercises
- Planned chapters:
- 15 - Reading the head
- 16 - Reading the body
- 17 - Connection reuse
Other books by this author
The Leanpub 60-day 100% Happiness Guarantee
Within 60 days of purchase you can get a 100% refund on any Leanpub purchase, in two clicks.
See full terms
80% Royalties. Earn $16 on a $20 book.
We pay 80% royalties. That's not a typo: you earn $16 on a $20 sale. If we sell 5000 non-refunded copies of your book or course for $20, you'll earn $80,000.
(Yes, some authors have already earned much more than that on Leanpub.)
In fact, authors have earnedover $12 million USDwriting, publishing and selling on Leanpub.
Learn more about writing on Leanpub
Free Updates. DRM Free.
If you buy a Leanpub book, you get free updates for as long as the author updates the book! Many authors use Leanpub to publish their books in-progress, while they are writing them. All readers get free updates, regardless of when they bought the book or how much they paid (including free).
Most Leanpub books are available in PDF (for computers) and EPUB (for phones, tablets and Kindle). The formats that a book includes are shown at the top right corner of this page.
Finally, Leanpub books don't have any DRM copy-protection nonsense, so you can easily read them on any supported device.
Learn more about Leanpub's ebook formats and where to read them