libcurl Wrapper in C++

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • libcurl Wrapper in C++

      Hallo,
      da ich regelmäßig Applikationen im HTTP-Bereich programmiere und ich C++ als Sprache favorisiere, suchte ich vor längerer Zeit eine Lösung. libcurl ist eine sehr starke Bibliothek die eigentlich alles liefert, was man möchte. Leider gibt es die Biblitohek nur für C. Der C++ Wrapper curlpp gefiel mir nicht, da er lange nicht mehr aktualisiert wurde, also beschloss ich, mir selbst einen zu schreiben. Ursprünglich war es nur eine easy Klasse, später wurde daraus immer mehr.

      Ein simples Beispiel

      C-Quellcode

      1. #include <iostream>
      2. #include <string>
      3. #include "curl/curl.hpp"
      4. int main()
      5. {
      6. curl::global::init();
      7. std::string buffer;
      8. try
      9. {
      10. curl::easy request;
      11. request.set_opt(CURLOPT_URL, "http://www.example.com");
      12. request.set_opt(CURLOPT_WRITEDATA, &buffer);
      13. request.set_opt(CURLOPT_WRITEFUNCTION, curl::write::to_string);
      14. request.perform();
      15. }
      16. catch (const curl::exception& e)
      17. {
      18. std::cerr << "Error: " << e.what() << ".\n";
      19. return 1;
      20. }
      21. std::cout << "Content: " << buffer << std::endl;
      22. curl::global::cleanup();
      23. }
      Alles anzeigen


      Lizenz
      Der Wrapper benutzt die gleiche Lizenz, wie libcurl sie benutzt.
      COPYRIGHT AND PERMISSION NOTICE

      Copyright (c) 2014, Delinquenz, delinquenz@live.de.

      All rights reserved.

      Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

      THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

      Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder.


      Download
      Der Code liegt in einem öffentlichen Git-Repository bei Bitbucket.

      To-Do
      - Const correctness verbessern
      - Templatespezialisierungen für curl::form, curl::header und std::string bei den curl::X::set_opt<T>() Methoden
      - Dokumentation verfassen (momentan muss die libcurl Dokumentation herhalten)

      Ich hoffe auf konstruktive Kritik und Verbesserungsvorschläge.
    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )

    • weil das curlpp von dem franzosen so scheisse war

      Was mich an curlpp gestört hat, war die Tatsache, dass das letzte Update 2009 gewesen ist. Zudem ist curlpp sehr abhängig von der Version, da es für die CURLOPTS etc. ein eigenes Enum hat, was ich persönlich als unnötigen Overhead empfinde.
      Es gibt übrigens seit kurzem einen neuen libcurl C++ Wrapper. Leider hat er auch viele Mängel. Zum Beispiel werden in dieser Headerdatei einige using Direktiven benutzt. Sofern man also diese Bibliothek benutzt, ist string das Gleiche wie std::string. Meines Erachtens nach garnicht schön, da ich meine std::string Variablen in kleineren Funktionen gern mal string nenne :)

      Wenn du fertig bist musst du es unbedingt an haxx.se schicken und bei NuGet hochladen

      Dafür muss aber noch einiges geschehen. Vorallem dokumentationstechnisch, sowas liegt mir garnicht. Aber ja, dazu zwinge ich mich auch noch irgendwie.
      Zudem muss ich erst einmal alle Interfaces verstehen und auch anwenden. Funktion wie curl_easy_recv() habe ich einfach so implementiert, heißt also, dass die Nutzung eher der C-Bibliothek entspricht und ich solche Funktionen bei meinen Projekten bisher nie benötigte.
      Dann muss ich mich noch mit Templatespezialisierungen beschäftigen, da der MSVC sich diesbezüglich.. quer stellt.
      Es fehlt einfach noch zuviel um das auf der offiziellen libcurl Seite zu stellen.
      Dazu müsste ich mich dann noch in CMake einlesen und meinen bei meinem Code nicht nur den sperrigen MSVC berücksichtigen, sondern auch clang und Xcode. GCC stellt kein Problem dar, da ich sowieso unter GCC programmiere.
      Zu guter Letzt empfinde ich meine jetzigen C++-Kenntnisse als nicht ausreichend für sowas.

      Das ganze ist ja stark gewachsen seit dem ich es das letzte mal auf Github gesehen hab :O

      Ja, da ich das eben bei diversen Projekten von mir benötige, kann ich nicht mehr ohne. Leider mag ich den C/C++ Mix garnicht und naja, so hat sich das eben entwickelt.

      Wenn ihr Kritik habt, immer her damit.