summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSameer Puri <sameer@users.noreply.github.com>2019-01-09 12:04:56 -0600
committerSameer Puri <11097096+sameer@users.noreply.github.com>2019-01-11 17:59:52 -0600
commit85775a353f9e26a81336f6cbe8941182dc0237e1 (patch)
tree6ae02c685659eb21ad0a85a91b7a0a063bd4f1a4
parent74245c7a9500be16d47a71753170bcc183c067db (diff)
Change impl Default to match go-ipfs-api behavior
-rw-r--r--ipfs-api/Cargo.toml2
-rw-r--r--ipfs-api/src/client.rs44
-rw-r--r--ipfs-api/src/lib.rs2
3 files changed, 46 insertions, 2 deletions
diff --git a/ipfs-api/Cargo.toml b/ipfs-api/Cargo.toml
index 3904dc1..871bb71 100644
--- a/ipfs-api/Cargo.toml
+++ b/ipfs-api/Cargo.toml
@@ -28,6 +28,8 @@ tokio = "0.1"
tokio-codec = "0.1"
tokio-io = "0.1"
walkdir = "2.2"
+dirs = "1.0"
+multiaddr = "0.3.1"
[dev-dependencies]
tokio-timer = "0.2"
diff --git a/ipfs-api/src/client.rs b/ipfs-api/src/client.rs
index e7f7d5b..1db5b4b 100644
--- a/ipfs-api/src/client.rs
+++ b/ipfs-api/src/client.rs
@@ -25,6 +25,7 @@ use response::{self, Error};
use serde::{Deserialize, Serialize};
use serde_json;
use std::io::Read;
+use std::net::SocketAddr;
use std::path::{Path, PathBuf};
use tokio_codec::{Decoder, FramedRead};
@@ -45,10 +46,49 @@ pub struct IpfsClient {
}
impl Default for IpfsClient {
- /// Creates an `IpfsClient` connected to `localhost:5001`.
+ /// Creates an `IpfsClient` connected to the endpoint specified in ~/.ipfs/api.
+ /// If not found, tries to connect to `localhost:5001`.
///
fn default() -> IpfsClient {
- IpfsClient::new("localhost", 5001).unwrap()
+ use multiaddr::{AddrComponent, ToMultiaddr};
+ use std::fs;
+ use std::net::IpAddr;
+
+ dirs::home_dir()
+ .map(|mut home_dir| {
+ home_dir.push(".ipfs");
+ home_dir.push("api");
+ home_dir
+ })
+ .and_then(|multiaddr_path| fs::read_to_string(&multiaddr_path).ok())
+ .and_then(|multiaddr_str| multiaddr_str.to_multiaddr().ok())
+ .and_then(|multiaddr| {
+ let mut addr: Option<IpAddr> = None;
+ let mut port: Option<u16> = None;
+ for addr_component in multiaddr.iter() {
+ match addr_component {
+ AddrComponent::IP4(v4addr) => addr = Some(v4addr.into()),
+ AddrComponent::IP6(v6addr) => addr = Some(v6addr.into()),
+ AddrComponent::TCP(tcpport) => port = Some(tcpport),
+ _ => {
+ return None;
+ }
+ }
+ }
+ if let (Some(addr), Some(port)) = (addr, port) {
+ Some(SocketAddr::new(addr, port))
+ } else {
+ None
+ }
+ })
+ .map(IpfsClient::from)
+ .unwrap_or_else(|| IpfsClient::new("localhost", 5001).unwrap())
+ }
+}
+
+impl From<SocketAddr> for IpfsClient {
+ fn from(socket_addr: SocketAddr) -> Self {
+ IpfsClient::new(&socket_addr.ip().to_string(), socket_addr.port()).unwrap()
}
}
diff --git a/ipfs-api/src/lib.rs b/ipfs-api/src/lib.rs
index 4314cbd..503e482 100644
--- a/ipfs-api/src/lib.rs
+++ b/ipfs-api/src/lib.rs
@@ -92,6 +92,8 @@ extern crate hyper_multipart_rfc7578 as hyper_multipart;
extern crate serde;
#[macro_use]
extern crate serde_derive;
+extern crate dirs;
+extern crate multiaddr;
extern crate serde_json;
extern crate serde_urlencoded;
extern crate tokio;