If you're looking for low-hanging-fruit to optimise, there's a ton of "foo = create_string(<some constant>)" and then "delete_string(foo)" not long afterwards in the code.
I also think I've found a bug: the code seems to assume that the colon in a header will be followed by one space (see parse_request_line in http.c) but according to https://tools.ietf.org/html/rfc7230#section-3.2 and my experience, that space is optional and there may be multiple of them.
(This is part of the reason I'm not a fan of text-based protocols: parsing is full of annoying edge-cases.)