One time we learned enough about how HTTP requests worked to fire some off by directly interacting with the sockets from python, rather than going through something like curl
It was an interesting learning experience. We thought we had to do it that way because we wanted to use a custom HTTP verb (something other than GET, PUT, POST, DELETE, etc etc) and assumed curl wouldn't let you
It turns out: curl -X takes a string parameter, it'll happily use whatever verb you give it. But it was still cool to learn :)