(Though these are just the answers ;^)
hive.sewanee.edueven though it may not be strictly necessary. If you are having issues connecting from telnet/browser to the proxy server, try it on
hive.sewanee.edu. If it still doesn't work, the problem must likely is in your program.
parse_urifunction is a good example of techniques to parse Request Headers; borrow from it liberally
fflushto force all changes to be written to the file, especially if you are using buffered I/O.
Use the model in the text/notes of the threaded echo server. After a connection has been accepted, everything you did to service the client/server interaction in the non-multithreaded version goes in a thread function. If you already had that in a separate function, this much will be relatively easy.
Testing…not so much. Initially test the same way, one request at a time. However the way to know this is multithreaded environment is to attack it with multiple requests at the same time. Make sure one request doesn't complete before the next starts.
All writes to the log file must be protected with a semaphore, so different threads don't overwrite each other's output.