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.
- Implement the missing methods
- Contributors are welcome!
- C++11 compiler (nlohmann json project is fetched automatically by CMake)
- CMake
- libcurl
When building documention, you also need:
- Doxygen (>= v1.9.0)
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.
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
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 files locally. From the root directory of this project:
cmake -DDOC=ON -B build
cmake --build build --target doc
#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.
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.
g++ -std=c++11 -I/path/to/header -L/path/to/lib -lipfs-http-client myprog.cc -o myprog
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)
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).
The code is distributed under the MIT License.