Latest 0.8.5
License MIT
Platforms ios 8.2
Frameworks Foundation

Curly is a high level API for libcurl intended to simplify the common usecase of performing memory based http operations.


Simple put or get

If you have a basic use-case even the curly_init() function is optional and you perform PUT or GET as easy as:

char* data = "test";
curly_http_get("", NULL, NULL);
curly_http_put("", data, strlen(data), NULL, NULL);

Using http headers

Header manipulation is done with a json array, for instance like this:

char* headers = "{"Accept":"text/plain"}";
curly_http_get("", headers, NULL);

Removing default headers follows the normal libcurl way of working so the example below will remove the Accept header from the request:

char* headers = "{"Accept":}";
curly_http_get("", headers, NULL);


There are several ways to use curly depending on your platform and requirements.


For iOS there is a .podspec available right here in the root so installation is simple. Public cocoapod releases are also published ( The iOS version has no OpenSSL dependendy but instead uses DarwinSSL.


As usual with native code in Android it’s a bit more complex than for iOS. Basically you have two options:

Use Curly as a static library

Use curly as a static lib together with libcrypto.a and libssl.a inside yourexisting dynamic library by adding the instructions below to your (the order of the libs is important):

include $(CLEAR_VARS)
LOCAL_MODULE := curl-prebuilt
LOCAL_SRC_FILES := PATH_TO_CURLY/third-party/curl/android/$(TARGET_ARCH_ABI)/libcurl.a
LOCAL_C_INCLUDES += PATH_TO_CURLY/third-party/ PATH_TO_CURLY/third-party/curl/android/include
LOCAL_STATIC_LIBRARIES += curl-prebuilt ssl-prebuilt crypto-prebuilt

Also keep in mind that if you intend to share the openssl lib with one or more projects in the same .so you can not initialize openssl more than once and you might have threading issues between the openssl users (there is plenty of information about this if you google for it). If you do not have another lib relying on openssl in the same .so you will have no issues, just link with the existing crypto libs on the android device or preferably with your own or the precompiled ones you find in the third-party folder since old Android versions have very old OpenSSL libs installed.

Use Curly as a dynamic library

This is a good option if you have other native libraries and you want to add http support. The prebuilt can be found in the android folder and it is already encapsulating libcrypto, libssl and libcurl. To add it to your existing .so project you would have to add the following in your

include $(CLEAR_VARS)
LOCAL_MODULE := curly-prebuilt
LOCAL_SRC_FILES := PATH_TO_CURLY/third-party/curly/android/libs/$(TARGET_ARCH_ABI)/
LOCAL_SHARED_LIBRARIES += curly-prebuilt 


The simplest approach is to just add curly.h and curly.c to your existing project and then poijt Visual Studio to your prebuilt curl and openssl libs (they are also provided in the third-party folder here).

Unit tests

Unit tests using Google Test are provided as well as a pre-made solution for Visual Studio.

Do not forget to run:

git submodule init
git submodule update

in order to fetch the GTest submodule needed for the unittests.

Visual Studio conversion of gtest solution

If you want to use the gtest unit-tests and Visual Studio says the gtest-md.sln file can not be converted to your version of Visual Studio you must first open the gtest-md.sln solution manually so the conversion can be performed. Then just open the CurlyTest.sln file and it should be ok.

Latest podspec

    "name": "curly",
    "version": "0.8.5",
    "summary": "High level libcurl api.",
    "homepage": "",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    "authors": "Johan Lantz",
    "platforms": {
        "ios": "8.2"
    "source": {
        "git": "",
        "tag": "0.8.5"
    "source_files": "*.{h,c}",
    "public_header_files": "curly.h",
    "preserve_paths": "third-party/curl/ios/**/*",
    "pod_target_xcconfig": {
        "HEADER_SEARCH_PATHS": ""$(PODS_ROOT)/curly/third-party/curl/ios/include"",
        "LIBRARY_SEARCH_PATHS": "$(inherited) "$(PODS_ROOT)/curly/third-party/curl/ios/lib""
    "user_target_xcconfig": {
        "LIBRARY_SEARCH_PATHS": "$(inherited) "$(PODS_ROOT)/curly/third-party/curl/ios/lib"",
        "ENABLE_BITCODE": "NO"
    "libraries": [
    "frameworks": "Foundation"

Pin It on Pinterest

Share This