From 85775a353f9e26a81336f6cbe8941182dc0237e1 Mon Sep 17 00:00:00 2001 From: Sameer Puri Date: Wed, 9 Jan 2019 12:04:56 -0600 Subject: Change impl Default to match go-ipfs-api behavior --- ipfs-api/Cargo.toml | 2 ++ ipfs-api/src/client.rs | 44 ++++++++++++++++++++++++++++++++++++++++++-- ipfs-api/src/lib.rs | 2 ++ 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 = None; + let mut port: Option = 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 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; -- cgit v1.2.3