Skip to content

vasild/cpp-ipfs-http-client

Repository files navigation

IPFS C++ HTTP API client library

Build CI Status CodeQL Documentation codecov GitHub Issues GitHub pull requests

IPFS C++ HTTP Client Library

Allows C++ applications to communicate with an IPFS node. It implements IPFS API bindings for C++. See the documentation and in partially the Client Class.

See also IPFS on GitHub.

The C++ API is broken up into the following sections (Note: links below go to the js-ipfs project). The following calls are implemented in cpp-ipfs-http-client:

  • Bitswap: all methods are still to-do
  • Block: get(), put(), stat()
  • Bootstrap: all methods are still to-do
  • Config: get(), set(), replace()
  • DAG: all methods are still to-do
  • DHT: findpeer(), findprovs()
  • Files: cat(), add(), ls()
  • Key: gen(), list(), rm(), rename()
  • Miscellaneous: id(), version()
  • Name: all methods are still to-do
  • Object: new(), put(), get(), data(), links(), stat(), patch.addLink(), patch.rmLink(), patch.appendData(), patch.setData()
  • Pin: add(), ls(), rm()
  • PubSub: all methods are still to-do
  • Refs: all methods are still to-do
  • Repo: stat()
  • Stats: bw(), repo() see Repo above
  • Swarm: addrs(), connect(), disconnect(), peers()

As you can see, not all methods are yet implemented.

TODO

  • Implement the missing methods
  • Contributors are welcome!

Dependencies

When building documention, you also need:

Build & Install

git clone https://github.com/vasild/cpp-ipfs-http-client.git
cd cpp-ipfs-http-client
# Configure build
cmake -B build
# Build
cmake --build build -j 8
# Install
sudo cmake --install build

Hint #1: You can also build using Ninja (iso Make), use the following as configure: cmake -GNinja -B build, then use: cmake --build build which will use Ninja, no need for -j anymore.
Hint #2: Build a specific target (eg. ipfs-http-client), use: cmake --build build --target ipfs-http-client -j 8
Hint #3: You could also build the library without tests, use the option: cmake -DBUILD_TESTING=OFF -B build

See the documentation for details.

Run Test cases

Only build & run the test cases, without code coverage:

# Prepare
cmake -B build
# Build & run our tests
cmake --build build --target our_tests -j 8

Build & run Test cases + Code Coverage

Test cases are build by default, but if you want to build with coverage:

cmake -DCMAKE_BUILD_TYPE=Debug -DCOVERAGE:BOOL=ON -DBUILD_SHARED_LIBS:BOOL=ON -B build
# Build & run tests + HTML report
cmake --build build --target ctest_coverage_html -j 8

# Or build & run tests + Cobertura XML file
cmake --build build --target ctest_coverage_xml -j 8

Build Doxygen

Build Doxygen files locally. From the root directory of this project:

cmake -DDOC=ON  -B build
cmake --build build --target doc

Usage

#include <ipfs/client.h>

#include <iostream>
#include <sstream>

int main(int, char**) {
  std::stringstream contents;

  ipfs::Client client("localhost", 5001);

  client.FilesGet("/ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme",
                  &contents);

  std::cout << contents.str() << std::endl;

  return 0;
}

More info see: Doxygen Docs - Client Class.

Multi-threading example

The client constructor and destructor are not thread safe. However, all the API IPFS calls are thread safe!

Note: A runtime error will be thrown on the request call (in this example the FilesGet()) when you call the Abort() method, allowing you to stop your code execution inside the thread.

An example of using a thread together with the IPFS Client:

#include <ipfs/client.h>

#include <sstream>
#include <thread>

int main(int, char**) {
  ipfs::Client client("localhost", 5001, "2m");

  // Only start one thread
  std::thread thread([&client]() {
    std::stringstream contents;
    try {
      // File should not exists, takes forever (until time-out)
      client.FilesGet("QmZp1rrtGTictR2rpNcx4673R7qU9Jdr9DQ6Z7F6Wgo2bQ",
                      &contents);
    } catch (const std::runtime_error& e) {
      std::cerr << "Error: " << e.what() << std::endl;
    }
  });

  if (thread.joinable()) {
    client.Abort();  // Abort request
    thread.join();   // Should not be blocking now
    client.Reset();  // Reset internal state
  }
  return 0;
}

See the full multi-threading example on: Doxygen - Examples.

Build via C++ compiler

g++ -std=c++11 -I/path/to/header -L/path/to/lib -lipfs-http-client myprog.cc -o myprog

Build via CMake

Use the C++ IPFS Client inside an existing CMake project. We add the IPFS client inside the lib folder. For example via git submodule (but git clone should also work):

cd your-cmake-project
git submodule add https://github.com/vasild/cpp-ipfs-http-client.git lib/ipfs-http-client

Edit your CMakeLists.txt file to include the C++ IPFS HTTP Client in your build:

add_subdirectory (lib/ipfs-http-client)

Finally, add the C++ IPFS HTTP static library to your target using target_link_libraries()
(in this example ${PROJECT_TARGET} variable is used as target name):

set(PROJECT_TARGET my-app)

target_link_libraries(${PROJECT_TARGET} PRIVATE ipfs-http-client)

Contribute

Feel free to open issues and pull requests. Report vulnerabilities publicly, similar to other non-security issues.

The project adheres to the Google C++ Style Guide. Use clang-format to properly format the code when you submit patches.

Write tests for new code. Changes should not cause the code coverage to go down (ideally up).

License

The code is distributed under the MIT License.

About

IPFS C++ HTTP API client library

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published