В целом, сложность HTTP в том, что там очень, очень много мелких расширений: тут тебе и передача множества сущностей, и докачка, и прокси (у http и https совершенно разные модели для прокси), и найти библиотеку которая поддерживает сразу всё — сложно, особенно в асинхронном виде. Посему курл, который делает практически всё это вот автоматически.