cpp-ipfs-http-client
cpp-ipfs-http-client copied to clipboard
IPFS C++ HTTP API client library
IPFS C++ HTTP API 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
- C++11 compiler (nlohmann json project is fetched automatically by CMake)
- CMake
- libcurl
When building documention, you also need:
- Doxygen (>= v1.9.0)
Install
git clone https://github.com/vasild/cpp-ipfs-http-client.git
cd cpp-ipfs-http-client
mkdir build
cd build
cmake ..
make -j 8
sudo make install
Hint: Only build the library without tests, use: cmake -DBUILD_TESTING=OFF ..
See the documentation for details.
Run Test cases
Only build & run the test cases, without code coverage:
mkdir build && cd build
cmake ..
make -j 8
# Run our test-cases
make our_tests
Build & run Test cases + Code Coverage
Test cases are build by default, but if you want to build with coverage:
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DCOVERAGE:BOOL=ON -DBUILD_SHARED_LIBS:BOOL=ON..
# Run tests & Build the HTML report
make ctest_coverage_html -j 8
# Or run tests & create a Cobertura XML file
make ctest_coverage_xml -j 8
Build Doxygen
Build Doxygen files locally. From the root directory of this project:
mkdir build && cd build
cmake -DDOC=ON ..
make 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.