Помнится, в стародавние времена, когда я разбирался с сетью в перле, работу через HTTP-прокси (особо как-то не парился) организовывал по такому ламерскому алгоритму:
1. создание сокета к прокси-серверу при помощи функции socket() (не юзал IO::Socket::INET);
2. коннект к прокси функцией connect();
3. формирование GET- или POST-запроса к требуемому урлу, например, GET www.google.com HTTP/1.0 ... (вставлял еще пару-тройку HTTP-полей);
4. отсылка запроса функцией send();
5. если нужно было получить результаты запроса, то юзалась recv(), а результат сохранялся в файле;
6. ну и делалась клозе на сокете

Работало как на беспарольных прокси, так и запароленных, для последних в HTTP-запрос добавлялась пара полей.