From 612978908f5c6817e48c569cdd55b8b60bbf5a2d Mon Sep 17 00:00:00 2001 From: Johan Anderholm Date: Fri, 23 Mar 2018 06:13:01 +0100 Subject: [PATCH 1/5] Reformat according to new rustfmt rules --- audio/src/fetch.rs | 14 +++----------- connect/src/discovery.rs | 4 ++-- connect/src/spirc.rs | 11 ++++------- core/src/audio_key.rs | 8 ++------ core/src/authentication.rs | 14 +++++--------- core/src/channel.rs | 2 +- core/src/connection/codec.rs | 3 +-- core/src/connection/handshake.rs | 7 ++----- core/src/connection/mod.rs | 24 ++++++++---------------- core/src/diffie_hellman.rs | 24 ++++++++---------------- core/src/mercury/mod.rs | 2 +- core/src/session.rs | 10 +++------- examples/play.rs | 4 +--- playback/src/audio_backend/jackaudio.rs | 8 ++------ playback/src/audio_backend/pipe.rs | 5 +---- playback/src/player.rs | 25 ++++++------------------- protocol/build.rs | 5 +---- src/main.rs | 15 +++------------ 18 files changed, 54 insertions(+), 131 deletions(-) diff --git a/audio/src/fetch.rs b/audio/src/fetch.rs index a45a7db7..968e1908 100644 --- a/audio/src/fetch.rs +++ b/audio/src/fetch.rs @@ -1,8 +1,8 @@ use bit_set::BitSet; use byteorder::{BigEndian, ByteOrder, WriteBytesExt}; -use futures::{Async, Future, Poll}; use futures::Stream; use futures::sync::{mpsc, oneshot}; +use futures::{Async, Future, Poll}; use std::cmp::min; use std::fs; use std::io::{self, Read, Seek, SeekFrom, Write}; @@ -288,20 +288,12 @@ impl Future for AudioFileFetch { Ok(Async::Ready(Some(data))) => { progress = true; - self.output - .as_mut() - .unwrap() - .write_all(data.as_ref()) - .unwrap(); + self.output.as_mut().unwrap().write_all(data.as_ref()).unwrap(); } Ok(Async::Ready(None)) => { progress = true; - trace!( - "chunk {} / {} complete", - self.index, - self.shared.chunk_count - ); + trace!("chunk {} / {} complete", self.index, self.shared.chunk_count); let full = { let mut bitmap = self.shared.bitmap.lock().unwrap(); diff --git a/connect/src/discovery.rs b/connect/src/discovery.rs index fce47bca..529c0ebd 100644 --- a/connect/src/discovery.rs +++ b/connect/src/discovery.rs @@ -2,10 +2,10 @@ use base64; use crypto; use crypto::digest::Digest; use crypto::mac::Mac; -use futures::{Future, Poll, Stream}; use futures::sync::mpsc; -use hyper::{self, Get, Post, StatusCode}; +use futures::{Future, Poll, Stream}; use hyper::server::{Http, Request, Response, Service}; +use hyper::{self, Get, Post, StatusCode}; #[cfg(feature = "with-dns-sd")] use dns_sd::DNSService; diff --git a/connect/src/spirc.rs b/connect/src/spirc.rs index 79a9ac8c..9d412714 100644 --- a/connect/src/spirc.rs +++ b/connect/src/spirc.rs @@ -1,6 +1,6 @@ -use futures::{Async, Future, Poll, Sink, Stream}; use futures::future; use futures::sync::{mpsc, oneshot}; +use futures::{Async, Future, Poll, Sink, Stream}; use protobuf::{self, Message}; use core::config::ConnectConfig; @@ -442,8 +442,7 @@ impl SpircTask { self.update_tracks(&frame); if self.state.get_track().len() > 0 { - self.state - .set_position_ms(frame.get_state().get_position_ms()); + self.state.set_position_ms(frame.get_state().get_position_ms()); self.state.set_position_measured_at(now_ms() as u64); let play = frame.get_state().get_status() == PlayStatus::kPlayStatusPlay; @@ -530,10 +529,8 @@ impl SpircTask { MessageType::kMessageTypeVolume => { self.device.set_volume(frame.get_volume()); - self.mixer.set_volume(volume_to_mixer( - frame.get_volume() as u16, - self.linear_volume, - )); + self.mixer + .set_volume(volume_to_mixer(frame.get_volume() as u16, self.linear_volume)); self.notify(None); } diff --git a/core/src/audio_key.rs b/core/src/audio_key.rs index 021b1dc8..410cc2c9 100644 --- a/core/src/audio_key.rs +++ b/core/src/audio_key.rs @@ -1,7 +1,7 @@ use byteorder::{BigEndian, ByteOrder, WriteBytesExt}; use bytes::Bytes; -use futures::{Async, Future, Poll}; use futures::sync::oneshot; +use futures::{Async, Future, Poll}; use std::collections::HashMap; use std::io::Write; @@ -35,11 +35,7 @@ impl AudioKeyManager { let _ = sender.send(Ok(AudioKey(key))); } 0xe => { - warn!( - "error audio key {:x} {:x}", - data.as_ref()[0], - data.as_ref()[1] - ); + warn!("error audio key {:x} {:x}", data.as_ref()[0], data.as_ref()[1]); let _ = sender.send(Err(AudioKeyError)); } _ => (), diff --git a/core/src/authentication.rs b/core/src/authentication.rs index c1fbed0d..17cc4c74 100644 --- a/core/src/authentication.rs +++ b/core/src/authentication.rs @@ -88,11 +88,8 @@ impl Credentials { let blob = { // Anyone know what this block mode is ? let mut data = vec![0u8; encrypted_blob.len()]; - let mut cipher = aes::ecb_decryptor( - aes::KeySize::KeySize192, - &key, - crypto::blockmodes::NoPadding, - ); + let mut cipher = + aes::ecb_decryptor(aes::KeySize::KeySize192, &key, crypto::blockmodes::NoPadding); cipher .decrypt( &mut crypto::buffer::RefReadBuffer::new(&encrypted_blob), @@ -193,10 +190,9 @@ pub fn get_credentials String>( Some(credentials.clone()) } - (Some(username), None, _) => Some(Credentials::with_password( - username.clone(), - prompt(&username), - )), + (Some(username), None, _) => { + Some(Credentials::with_password(username.clone(), prompt(&username))) + } (None, _, Some(credentials)) => Some(credentials), diff --git a/core/src/channel.rs b/core/src/channel.rs index 112e6ad4..57655feb 100644 --- a/core/src/channel.rs +++ b/core/src/channel.rs @@ -1,7 +1,7 @@ use byteorder::{BigEndian, ByteOrder}; use bytes::Bytes; -use futures::{Async, Poll, Stream}; use futures::sync::{mpsc, BiLock}; +use futures::{Async, Poll, Stream}; use std::collections::HashMap; use util::SeqGenerator; diff --git a/core/src/connection/codec.rs b/core/src/connection/codec.rs index 4a8fd208..1847b8ca 100644 --- a/core/src/connection/codec.rs +++ b/core/src/connection/codec.rs @@ -88,8 +88,7 @@ impl Decoder for APCodec { let mut payload = buf.split_to(size + MAC_SIZE); - self.decode_cipher - .decrypt(&mut payload.get_mut(..size).unwrap()); + self.decode_cipher.decrypt(&mut payload.get_mut(..size).unwrap()); let mac = payload.split_off(size); self.decode_cipher.check_mac(mac.as_ref())?; diff --git a/core/src/connection/handshake.rs b/core/src/connection/handshake.rs index db945162..a8017742 100644 --- a/core/src/connection/handshake.rs +++ b/core/src/connection/handshake.rs @@ -7,9 +7,9 @@ use protobuf::{self, Message, MessageStatic}; use rand::thread_rng; use std::io::{self, Read}; use std::marker::PhantomData; -use tokio_io::{AsyncRead, AsyncWrite}; use tokio_io::codec::Framed; use tokio_io::io::{read_exact, write_all, ReadExact, Window, WriteAll}; +use tokio_io::{AsyncRead, AsyncWrite}; use super::codec::APCodec; use diffie_hellman::DHLocalKeys; @@ -93,10 +93,7 @@ fn client_hello(connection: T, gc: Vec) -> WriteAll Vec { - let shared_key = util::powm( - &BigUint::from_bytes_be(remote_key), - &self.private_key, - &DH_PRIME, - ); + let shared_key = util::powm(&BigUint::from_bytes_be(remote_key), &self.private_key, &DH_PRIME); shared_key.to_bytes_be() } } diff --git a/core/src/mercury/mod.rs b/core/src/mercury/mod.rs index e79c281f..80b45ec5 100644 --- a/core/src/mercury/mod.rs +++ b/core/src/mercury/mod.rs @@ -1,7 +1,7 @@ use byteorder::{BigEndian, ByteOrder}; use bytes::Bytes; -use futures::{Async, Future, Poll}; use futures::sync::{mpsc, oneshot}; +use futures::{Async, Future, Poll}; use protobuf; use protocol; use std::collections::HashMap; diff --git a/core/src/session.rs b/core/src/session.rs index af1c12cc..d31d9b4e 100644 --- a/core/src/session.rs +++ b/core/src/session.rs @@ -1,9 +1,9 @@ use bytes::Bytes; -use futures::{Async, Future, IntoFuture, Poll, Stream}; use futures::sync::mpsc; +use futures::{Async, Future, IntoFuture, Poll, Stream}; use std::io; -use std::sync::{Arc, RwLock, Weak}; use std::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT}; +use std::sync::{Arc, RwLock, Weak}; use tokio_core::reactor::{Handle, Remote}; use apresolve::apresolve_or_fallback; @@ -124,11 +124,7 @@ impl Session { .map(|_| ()); let receiver_task = DispatchTask(stream, session.weak()); - let task = Box::new( - (receiver_task, sender_task) - .into_future() - .map(|((), ())| ()), - ); + let task = Box::new((receiver_task, sender_task).into_future().map(|((), ())| ())); (session, task) } diff --git a/examples/play.rs b/examples/play.rs index 4050a513..3d2de454 100644 --- a/examples/play.rs +++ b/examples/play.rs @@ -36,9 +36,7 @@ fn main() { let session = core.run(Session::connect(session_config, credentials, None, handle)) .unwrap(); - let player = Player::new(player_config, session.clone(), None, move || { - (backend)(None) - }); + let player = Player::new(player_config, session.clone(), None, move || (backend)(None)); println!("Playing..."); core.run(player.load(track, true, 0)).unwrap(); diff --git a/playback/src/audio_backend/jackaudio.rs b/playback/src/audio_backend/jackaudio.rs index 5eacdff4..98a68ec9 100644 --- a/playback/src/audio_backend/jackaudio.rs +++ b/playback/src/audio_backend/jackaudio.rs @@ -44,12 +44,8 @@ impl Open for JackSink { let client_name = client_name.unwrap_or("librespot".to_string()); let (client, _status) = Client::new(&client_name[..], client_options::NO_START_SERVER).unwrap(); - let ch_r = client - .register_port("out_0", AudioOutSpec::default()) - .unwrap(); - let ch_l = client - .register_port("out_1", AudioOutSpec::default()) - .unwrap(); + let ch_r = client.register_port("out_0", AudioOutSpec::default()).unwrap(); + let ch_l = client.register_port("out_1", AudioOutSpec::default()).unwrap(); // buffer for samples from librespot (~10ms) let (tx, rx) = sync_channel(2 * 1024 * 4); let jack_data = JackData { diff --git a/playback/src/audio_backend/pipe.rs b/playback/src/audio_backend/pipe.rs index c15727e6..414e1929 100644 --- a/playback/src/audio_backend/pipe.rs +++ b/playback/src/audio_backend/pipe.rs @@ -28,10 +28,7 @@ impl Sink for StdoutSink { fn write(&mut self, data: &[i16]) -> io::Result<()> { let data: &[u8] = unsafe { - slice::from_raw_parts( - data.as_ptr() as *const u8, - data.len() * mem::size_of::(), - ) + slice::from_raw_parts(data.as_ptr() as *const u8, data.len() * mem::size_of::()) }; self.0.write_all(data)?; diff --git a/playback/src/player.rs b/playback/src/player.rs index 9cd874f0..d8036830 100644 --- a/playback/src/player.rs +++ b/playback/src/player.rs @@ -1,7 +1,7 @@ use byteorder::{LittleEndian, ReadBytesExt}; use futures; -use futures::{future, Future}; use futures::sync::oneshot; +use futures::{future, Future}; use std; use std::borrow::Cow; use std::io::{Read, Result, Seek, SeekFrom}; @@ -93,10 +93,8 @@ impl NormalisationData { } fn get_factor(config: &PlayerConfig, data: NormalisationData) -> f32 { - let mut normalisation_factor = f32::powf( - 10.0, - (data.track_gain_db + config.normalisation_pregain) / 20.0, - ); + let mut normalisation_factor = + f32::powf(10.0, (data.track_gain_db + config.normalisation_pregain) / 20.0); if normalisation_factor * data.track_peak > 1.0 { warn!("Reducing normalisation factor to prevent clipping. Please add negative pregain to avoid."); @@ -231,12 +229,7 @@ impl PlayerState { use self::PlayerState::*; match *self { Stopped | EndOfTrack { .. } => None, - Paused { - ref mut decoder, .. - } - | Playing { - ref mut decoder, .. - } => Some(decoder), + Paused { ref mut decoder, .. } | Playing { ref mut decoder, .. } => Some(decoder), Invalid => panic!("invalid state"), } } @@ -525,10 +518,7 @@ impl PlayerInternal { .map(|alt_id| Track::get(&self.session, *alt_id)); let alternatives = future::join_all(alternatives).wait().unwrap(); - alternatives - .into_iter() - .find(|alt| alt.available) - .map(Cow::Owned) + alternatives.into_iter().find(|alt| alt.available).map(Cow::Owned) } } @@ -558,10 +548,7 @@ impl PlayerInternal { let file_id = match track.files.get(&format) { Some(&file_id) => file_id, None => { - warn!( - "Track \"{}\" is not available in format {:?}", - track.name, format - ); + warn!("Track \"{}\" is not available in format {:?}", track.name, format); return None; } }; diff --git a/protocol/build.rs b/protocol/build.rs index 1ba946fa..3a042733 100644 --- a/protocol/build.rs +++ b/protocol/build.rs @@ -7,10 +7,7 @@ fn main() { for &(path, expected_checksum) in files::FILES { let actual = cksum_file(path).unwrap(); if expected_checksum != actual { - panic!( - "Checksum for {:?} does not match. Try running build.sh", - path - ); + panic!("Checksum for {:?} does not match. Try running build.sh", path); } } } diff --git a/src/main.rs b/src/main.rs index 7f1b14ab..6a5582e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,8 +13,8 @@ extern crate tokio_signal; use crypto::digest::Digest; use crypto::sha1::Sha1; use env_logger::LogBuilder; -use futures::{Async, Future, Poll, Stream}; use futures::sync::mpsc::UnboundedReceiver; +use futures::{Async, Future, Poll, Stream}; use std::env; use std::io::{self, stderr, Write}; use std::mem; @@ -108,11 +108,7 @@ fn setup(args: &[String]) -> Setup { "cache", "Path to a directory where files will be cached.", "CACHE", - ).optflag( - "", - "disable-audio-cache", - "Disable caching of the audio data.", - ) + ).optflag("", "disable-audio-cache", "Disable caching of the audio data.") .reqopt("n", "name", "Device name", "NAME") .optopt("", "device-type", "Displayed device type", "DEVICE_TYPE") .optopt( @@ -176,12 +172,7 @@ fn setup(args: &[String]) -> Setup { let matches = match opts.parse(&args[1..]) { Ok(m) => m, Err(f) => { - writeln!( - stderr(), - "error: {}\n{}", - f.to_string(), - usage(&args[0], &opts) - ).unwrap(); + writeln!(stderr(), "error: {}\n{}", f.to_string(), usage(&args[0], &opts)).unwrap(); exit(1); } }; From 3bdc5e0073938879ecdf898e4812ba20f3ee494d Mon Sep 17 00:00:00 2001 From: Johan Anderholm Date: Fri, 23 Mar 2018 06:15:15 +0100 Subject: [PATCH 2/5] Add support for http proxy Currently only http proxy (no https) is supported. --- core/Cargo.toml | 3 +- core/src/apresolve.rs | 29 ++++++---- core/src/config.rs | 2 + core/src/connection/mod.rs | 35 ++++++++++-- core/src/lib.rs | 2 + core/src/proxytunnel.rs | 109 +++++++++++++++++++++++++++++++++++++ core/src/session.rs | 5 +- src/main.rs | 2 + 8 files changed, 170 insertions(+), 17 deletions(-) create mode 100644 core/src/proxytunnel.rs diff --git a/core/Cargo.toml b/core/Cargo.toml index b2a68ef8..28d85a6e 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -12,8 +12,9 @@ base64 = "0.5.0" byteorder = "1.0" bytes = "0.4" error-chain = { version = "0.9.0", default_features = false } -extprim = "1.5.1" +extprim = "1.5.1" futures = "0.1.8" +httparse = "1.2.4" hyper = "0.11.2" lazy_static = "0.2.0" log = "0.3.5" diff --git a/core/src/apresolve.rs b/core/src/apresolve.rs index 8db9a5ed..37cbfed0 100644 --- a/core/src/apresolve.rs +++ b/core/src/apresolve.rs @@ -1,7 +1,7 @@ -const AP_FALLBACK: &'static str = "ap.spotify.com:80"; +const AP_FALLBACK: &'static str = "ap.spotify.com:443"; const APRESOLVE_ENDPOINT: &'static str = "http://apresolve.spotify.com/"; -use futures::{Future, Stream}; +use futures::{future, Future, Stream}; use hyper::{self, Client, Uri}; use serde_json; use std::str::FromStr; @@ -40,15 +40,24 @@ fn apresolve(handle: &Handle) -> Box> { Box::new(ap) } -pub(crate) fn apresolve_or_fallback(handle: &Handle) -> Box> +pub(crate) fn apresolve_or_fallback( + handle: &Handle, + proxy: &Option, +) -> Box> where E: 'static, { - let ap = apresolve(handle).or_else(|e| { - warn!("Failed to resolve Access Point: {}", e.description()); - warn!("Using fallback \"{}\"", AP_FALLBACK); - Ok(AP_FALLBACK.into()) - }); - - Box::new(ap) + if proxy.is_some() { + // TODO: Use a proper proxy library and filter out a 443 proxy instead of relying on fallback. + // The problem with current libraries (hyper-proxy, reqwest) is that they depend on TLS + // and this is a dependency we might not want. + Box::new(future::result(Ok(AP_FALLBACK.into()))) + } else { + let ap = apresolve(handle).or_else(|e| { + warn!("Failed to resolve Access Point: {}", e.description()); + warn!("Using fallback \"{}\"", AP_FALLBACK); + Ok(AP_FALLBACK.into()) + }); + Box::new(ap) + } } diff --git a/core/src/config.rs b/core/src/config.rs index 1e7ec9a7..7afedcbd 100644 --- a/core/src/config.rs +++ b/core/src/config.rs @@ -8,6 +8,7 @@ use version; pub struct SessionConfig { pub user_agent: String, pub device_id: String, + pub proxy: Option, } impl Default for SessionConfig { @@ -16,6 +17,7 @@ impl Default for SessionConfig { SessionConfig { user_agent: version::version_string(), device_id: device_id, + proxy: None, } } } diff --git a/core/src/connection/mod.rs b/core/src/connection/mod.rs index 85645563..f9b4567b 100644 --- a/core/src/connection/mod.rs +++ b/core/src/connection/mod.rs @@ -5,9 +5,11 @@ pub use self::codec::APCodec; pub use self::handshake::handshake; use futures::{Future, Sink, Stream}; +use hyper::Uri; use protobuf::{self, Message}; use std::io; use std::net::ToSocketAddrs; +use std::str::FromStr; use tokio_core::net::TcpStream; use tokio_core::reactor::Handle; use tokio_io::codec::Framed; @@ -15,17 +17,42 @@ use tokio_io::codec::Framed; use authentication::Credentials; use version; +use proxytunnel; + pub type Transport = Framed; pub fn connect( addr: A, handle: &Handle, + proxy: &Option, ) -> Box> { - let addr = addr.to_socket_addrs().unwrap().next().unwrap(); - let socket = TcpStream::connect(&addr, handle); - let connection = socket.and_then(|socket| handshake(socket)); + let (addr, connect_url) = match *proxy { + Some(ref url) => { + let url = Uri::from_str(url).expect("Malformed proxy address"); + let host = url.host().expect("Malformed proxy address: no host"); + let port = url.port().unwrap_or(3128); - Box::new(connection) + ( + format!("{}:{}", host, port) + .to_socket_addrs() + .unwrap() + .next() + .unwrap(), + Some(addr.to_socket_addrs().unwrap().next().unwrap()), + ) + } + None => (addr.to_socket_addrs().unwrap().next().unwrap(), None), + }; + + let socket = TcpStream::connect(&addr, handle); + if let Some(connect_url) = connect_url { + let connection = + socket.and_then(move |socket| proxytunnel::connect(socket, connect_url).and_then(handshake)); + Box::new(connection) + } else { + let connection = socket.and_then(handshake); + Box::new(connection) + } } pub fn authenticate( diff --git a/core/src/lib.rs b/core/src/lib.rs index 2d011385..b1f13581 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -16,6 +16,7 @@ extern crate byteorder; extern crate bytes; extern crate crypto; extern crate extprim; +extern crate httparse; extern crate hyper; extern crate num_bigint; extern crate num_integer; @@ -44,6 +45,7 @@ mod connection; pub mod diffie_hellman; pub mod keymaster; pub mod mercury; +mod proxytunnel; pub mod session; pub mod spotify_id; pub mod util; diff --git a/core/src/proxytunnel.rs b/core/src/proxytunnel.rs new file mode 100644 index 00000000..b7d2e5bb --- /dev/null +++ b/core/src/proxytunnel.rs @@ -0,0 +1,109 @@ +use futures::{Async, Future, Poll}; +use httparse; + +use std::io; +use std::net::SocketAddr; +use tokio_io::io::{read, write_all, Read, Window, WriteAll}; +use tokio_io::{AsyncRead, AsyncWrite}; + +use std::error::Error; + +pub struct ProxyTunnel { + state: ProxyState, +} + +enum ProxyState { + ProxyConnect(WriteAll>), + ProxyResponse(Read>>), +} + +pub fn connect(connection: T, connect_url: SocketAddr) -> ProxyTunnel { + let proxy = proxy_connect(connection, connect_url); + ProxyTunnel { + state: ProxyState::ProxyConnect(proxy), + } +} + +impl Future for ProxyTunnel { + type Item = T; + type Error = io::Error; + + fn poll(&mut self) -> Poll { + use self::ProxyState::*; + loop { + self.state = match self.state { + ProxyConnect(ref mut write) => { + let (connection, mut accumulator) = try_ready!(write.poll()); + + let capacity = accumulator.capacity(); + accumulator.resize(capacity, 0); + let window = Window::new(accumulator); + + let read = read(connection, window); + ProxyResponse(read) + } + + ProxyResponse(ref mut read_f) => { + let (connection, mut window, bytes_read) = try_ready!(read_f.poll()); + + if bytes_read == 0 { + return Err(io::Error::new(io::ErrorKind::Other, "Early EOF from proxy")); + } + + let data_end = window.start() + bytes_read; + + let buf = window.get_ref()[0..data_end].to_vec(); + let mut headers = [httparse::EMPTY_HEADER; 16]; + let mut response = httparse::Response::new(&mut headers); + let status = match response.parse(&buf) { + Ok(status) => status, + Err(err) => return Err(io::Error::new(io::ErrorKind::Other, err.description())), + }; + + if status.is_complete() { + if let Some(code) = response.code { + if code == 200 { + // Proxy says all is well + return Ok(Async::Ready(connection)); + } else { + let reason = response.reason.unwrap_or("no reason"); + let msg = format!("Proxy responded with {}: {}", code, reason); + + return Err(io::Error::new(io::ErrorKind::Other, msg)); + } + } else { + return Err(io::Error::new( + io::ErrorKind::Other, + "Malformed response from proxy", + )); + } + } else { + if data_end >= window.end() { + // Allocate some more buffer space + let newsize = data_end + 100; + window.get_mut().resize(newsize, 0); + window.set_end(newsize); + } + // We did not get a full header + window.set_start(data_end); + let read = read(connection, window); + ProxyResponse(read) + } + } + } + } + } +} + +fn proxy_connect(connection: T, connect_url: SocketAddr) -> WriteAll> { + // TODO: It would be better to use a non-resolved url here. This usually works, + // but it may fail in some environments and it will leak DNS requests. + let buffer = format!( + "CONNECT {0}:{1} HTTP/1.1\r\n\ + \r\n", + connect_url.ip(), + connect_url.port() + ).into_bytes(); + + write_all(connection, buffer) +} diff --git a/core/src/session.rs b/core/src/session.rs index d31d9b4e..4bdcbde9 100644 --- a/core/src/session.rs +++ b/core/src/session.rs @@ -50,12 +50,13 @@ impl Session { cache: Option, handle: Handle, ) -> Box> { - let access_point = apresolve_or_fallback::(&handle); + let access_point = apresolve_or_fallback::(&handle, &config.proxy); let handle_ = handle.clone(); + let proxy = config.proxy.clone(); let connection = access_point.and_then(move |addr| { info!("Connecting to AP \"{}\"", addr); - connection::connect::<&str>(&addr, &handle_) + connection::connect::<&str>(&addr, &handle_, &proxy) }); let device_id = config.device_id.clone(); diff --git a/src/main.rs b/src/main.rs index 6a5582e5..b7654e1b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -126,6 +126,7 @@ fn setup(args: &[String]) -> Setup { .optflag("v", "verbose", "Enable verbose output") .optopt("u", "username", "Username to sign in with", "USERNAME") .optopt("p", "password", "Password", "PASSWORD") + .optopt("", "proxy", "HTTP proxy to use when connecting", "PROXY") .optflag("", "disable-discovery", "Disable discovery mode") .optopt( "", @@ -247,6 +248,7 @@ fn setup(args: &[String]) -> Setup { SessionConfig { user_agent: version::version_string(), device_id: device_id, + proxy: matches.opt_str("proxy").or(std::env::var("http_proxy").ok()), } }; From 1a04e3b899a4bd6dfe75e8b43988b70f79051c67 Mon Sep 17 00:00:00 2001 From: Johan Anderholm Date: Fri, 23 Mar 2018 16:52:24 +0100 Subject: [PATCH 3/5] Resolve AP through proxy as well --- core/Cargo.toml | 1 + core/src/apresolve.rs | 65 ++++++++++++++++++++++++++------------ core/src/connection/mod.rs | 10 +++--- core/src/lib.rs | 1 + core/src/proxytunnel.rs | 21 ++++++------ core/src/session.rs | 2 +- 6 files changed, 63 insertions(+), 37 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index 28d85a6e..c0bafbe1 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -16,6 +16,7 @@ extprim = "1.5.1" futures = "0.1.8" httparse = "1.2.4" hyper = "0.11.2" +hyper-proxy = { version = "0.4.1", default_features = false } lazy_static = "0.2.0" log = "0.3.5" num-bigint = "0.1.35" diff --git a/core/src/apresolve.rs b/core/src/apresolve.rs index 37cbfed0..db3b8d7a 100644 --- a/core/src/apresolve.rs +++ b/core/src/apresolve.rs @@ -1,8 +1,10 @@ const AP_FALLBACK: &'static str = "ap.spotify.com:443"; const APRESOLVE_ENDPOINT: &'static str = "http://apresolve.spotify.com/"; -use futures::{future, Future, Stream}; -use hyper::{self, Client, Uri}; +use futures::{Future, Stream}; +use hyper::client::HttpConnector; +use hyper::{self, Client, Method, Request, Uri}; +use hyper_proxy::{Intercept, Proxy, ProxyConnector}; use serde_json; use std::str::FromStr; use tokio_core::reactor::Handle; @@ -14,11 +16,29 @@ pub struct APResolveData { ap_list: Vec, } -fn apresolve(handle: &Handle) -> Box> { +fn apresolve(handle: &Handle, proxy: &Option) -> Box> { let url = Uri::from_str(APRESOLVE_ENDPOINT).expect("invalid AP resolve URL"); + let use_proxy = proxy.is_some(); - let client = Client::new(handle); - let response = client.get(url); + let mut req = Request::new(Method::Get, url.clone()); + let response = match proxy { + &Some(ref val) => { + let proxy_url = Uri::from_str(&val).expect("invalid http proxy"); + let proxy = Proxy::new(Intercept::All, proxy_url); + let connector = HttpConnector::new(4, handle); + let proxy_connector = ProxyConnector::from_proxy_unsecured(connector, proxy); + if let Some(headers) = proxy_connector.http_headers(&url) { + req.headers_mut().extend(headers.iter()); + req.set_proxy(true); + } + let client = Client::configure().connector(proxy_connector).build(handle); + client.request(req) + } + _ => { + let client = Client::new(handle); + client.request(req) + } + }; let body = response.and_then(|response| { response.body().fold(Vec::new(), |mut acc, chunk| { @@ -32,8 +52,19 @@ fn apresolve(handle: &Handle) -> Box> { let data = body.and_then(|body| serde_json::from_str::(&body).chain_err(|| "invalid JSON")); - let ap = data.and_then(|data| { - let ap = data.ap_list.first().ok_or("empty AP List")?; + let ap = data.and_then(move |data| { + let mut aps = data.ap_list.iter().filter(|ap| { + if use_proxy { + // It is unlikely that the proxy will accept CONNECT on anything other than 443. + Uri::from_str(ap) + .ok() + .map_or(false, |uri| uri.port().map_or(false, |port| port == 443)) + } else { + true + } + }); + + let ap = aps.next().ok_or("empty AP List")?; Ok(ap.clone()) }); @@ -47,17 +78,11 @@ pub(crate) fn apresolve_or_fallback( where E: 'static, { - if proxy.is_some() { - // TODO: Use a proper proxy library and filter out a 443 proxy instead of relying on fallback. - // The problem with current libraries (hyper-proxy, reqwest) is that they depend on TLS - // and this is a dependency we might not want. - Box::new(future::result(Ok(AP_FALLBACK.into()))) - } else { - let ap = apresolve(handle).or_else(|e| { - warn!("Failed to resolve Access Point: {}", e.description()); - warn!("Using fallback \"{}\"", AP_FALLBACK); - Ok(AP_FALLBACK.into()) - }); - Box::new(ap) - } + let ap = apresolve(handle, proxy).or_else(|e| { + warn!("Failed to resolve Access Point: {}", e.description()); + warn!("Using fallback \"{}\"", AP_FALLBACK); + Ok(AP_FALLBACK.into()) + }); + + Box::new(ap) } diff --git a/core/src/connection/mod.rs b/core/src/connection/mod.rs index f9b4567b..dec4daf6 100644 --- a/core/src/connection/mod.rs +++ b/core/src/connection/mod.rs @@ -21,8 +21,8 @@ use proxytunnel; pub type Transport = Framed; -pub fn connect( - addr: A, +pub fn connect( + addr: String, handle: &Handle, proxy: &Option, ) -> Box> { @@ -38,7 +38,7 @@ pub fn connect( .unwrap() .next() .unwrap(), - Some(addr.to_socket_addrs().unwrap().next().unwrap()), + Some(addr.clone()), ) } None => (addr.to_socket_addrs().unwrap().next().unwrap(), None), @@ -46,8 +46,8 @@ pub fn connect( let socket = TcpStream::connect(&addr, handle); if let Some(connect_url) = connect_url { - let connection = - socket.and_then(move |socket| proxytunnel::connect(socket, connect_url).and_then(handshake)); + let connection = socket + .and_then(move |socket| proxytunnel::connect(socket, &connect_url).and_then(handshake)); Box::new(connection) } else { let connection = socket.and_then(handshake); diff --git a/core/src/lib.rs b/core/src/lib.rs index b1f13581..e7b4b3c7 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -18,6 +18,7 @@ extern crate crypto; extern crate extprim; extern crate httparse; extern crate hyper; +extern crate hyper_proxy; extern crate num_bigint; extern crate num_integer; extern crate num_traits; diff --git a/core/src/proxytunnel.rs b/core/src/proxytunnel.rs index b7d2e5bb..3f1db053 100644 --- a/core/src/proxytunnel.rs +++ b/core/src/proxytunnel.rs @@ -1,13 +1,13 @@ +use std::error::Error; +use std::io; +use std::str::FromStr; + use futures::{Async, Future, Poll}; use httparse; - -use std::io; -use std::net::SocketAddr; +use hyper::Uri; use tokio_io::io::{read, write_all, Read, Window, WriteAll}; use tokio_io::{AsyncRead, AsyncWrite}; -use std::error::Error; - pub struct ProxyTunnel { state: ProxyState, } @@ -17,7 +17,7 @@ enum ProxyState { ProxyResponse(Read>>), } -pub fn connect(connection: T, connect_url: SocketAddr) -> ProxyTunnel { +pub fn connect(connection: T, connect_url: &str) -> ProxyTunnel { let proxy = proxy_connect(connection, connect_url); ProxyTunnel { state: ProxyState::ProxyConnect(proxy), @@ -95,14 +95,13 @@ impl Future for ProxyTunnel { } } -fn proxy_connect(connection: T, connect_url: SocketAddr) -> WriteAll> { - // TODO: It would be better to use a non-resolved url here. This usually works, - // but it may fail in some environments and it will leak DNS requests. +fn proxy_connect(connection: T, connect_url: &str) -> WriteAll> { + let uri = Uri::from_str(&connect_url).unwrap(); let buffer = format!( "CONNECT {0}:{1} HTTP/1.1\r\n\ \r\n", - connect_url.ip(), - connect_url.port() + uri.host().expect(&format!("No host in {}", uri)), + uri.port().expect(&format!("No port in {}", uri)) ).into_bytes(); write_all(connection, buffer) diff --git a/core/src/session.rs b/core/src/session.rs index 4bdcbde9..ad0bf27a 100644 --- a/core/src/session.rs +++ b/core/src/session.rs @@ -56,7 +56,7 @@ impl Session { let proxy = config.proxy.clone(); let connection = access_point.and_then(move |addr| { info!("Connecting to AP \"{}\"", addr); - connection::connect::<&str>(&addr, &handle_, &proxy) + connection::connect(addr, &handle_, &proxy) }); let device_id = config.device_id.clone(); From 3a14e9a6be778fb44df7e69b1586894639026f2a Mon Sep 17 00:00:00 2001 From: Johan Anderholm Date: Sat, 24 Mar 2018 08:00:38 +0000 Subject: [PATCH 4/5] Validate proxy urls better. Use the url crate to handle proxies to make sure they conform to a proper format. --- Cargo.toml | 2 +- core/Cargo.toml | 1 + core/src/apresolve.rs | 11 ++++++----- core/src/config.rs | 3 ++- core/src/connection/mod.rs | 19 ++++--------------- core/src/lib.rs | 1 + core/src/proxytunnel.rs | 2 +- src/main.rs | 20 +++++++++++++++++++- 8 files changed, 35 insertions(+), 24 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5e392695..3af02908 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,7 +50,7 @@ serde_json = "0.9.5" tokio-core = "0.1.2" tokio-io = "0.1" tokio-signal = "0.1.2" -url = "1.3" +url = "1.7.0" [build-dependencies] rand = "0.3.13" diff --git a/core/Cargo.toml b/core/Cargo.toml index c0bafbe1..ed1206aa 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -32,6 +32,7 @@ serde_json = "0.9.5" shannon = "0.2.0" tokio-core = "0.1.2" tokio-io = "0.1" +url = "1.7.0" uuid = { version = "0.4", features = ["v4"] } [build-dependencies] diff --git a/core/src/apresolve.rs b/core/src/apresolve.rs index db3b8d7a..9ff23cf3 100644 --- a/core/src/apresolve.rs +++ b/core/src/apresolve.rs @@ -8,6 +8,7 @@ use hyper_proxy::{Intercept, Proxy, ProxyConnector}; use serde_json; use std::str::FromStr; use tokio_core::reactor::Handle; +use url::Url; error_chain!{} @@ -16,14 +17,14 @@ pub struct APResolveData { ap_list: Vec, } -fn apresolve(handle: &Handle, proxy: &Option) -> Box> { +fn apresolve(handle: &Handle, proxy: &Option) -> Box> { let url = Uri::from_str(APRESOLVE_ENDPOINT).expect("invalid AP resolve URL"); let use_proxy = proxy.is_some(); let mut req = Request::new(Method::Get, url.clone()); - let response = match proxy { - &Some(ref val) => { - let proxy_url = Uri::from_str(&val).expect("invalid http proxy"); + let response = match *proxy { + Some(ref val) => { + let proxy_url = Uri::from_str(val.as_str()).expect("invalid http proxy"); let proxy = Proxy::new(Intercept::All, proxy_url); let connector = HttpConnector::new(4, handle); let proxy_connector = ProxyConnector::from_proxy_unsecured(connector, proxy); @@ -73,7 +74,7 @@ fn apresolve(handle: &Handle, proxy: &Option) -> Box( handle: &Handle, - proxy: &Option, + proxy: &Option, ) -> Box> where E: 'static, diff --git a/core/src/config.rs b/core/src/config.rs index 7afedcbd..3511ee3f 100644 --- a/core/src/config.rs +++ b/core/src/config.rs @@ -1,5 +1,6 @@ use std::fmt; use std::str::FromStr; +use url::Url; use uuid::Uuid; use version; @@ -8,7 +9,7 @@ use version; pub struct SessionConfig { pub user_agent: String, pub device_id: String, - pub proxy: Option, + pub proxy: Option, } impl Default for SessionConfig { diff --git a/core/src/connection/mod.rs b/core/src/connection/mod.rs index dec4daf6..7e527b20 100644 --- a/core/src/connection/mod.rs +++ b/core/src/connection/mod.rs @@ -5,14 +5,13 @@ pub use self::codec::APCodec; pub use self::handshake::handshake; use futures::{Future, Sink, Stream}; -use hyper::Uri; use protobuf::{self, Message}; use std::io; use std::net::ToSocketAddrs; -use std::str::FromStr; use tokio_core::net::TcpStream; use tokio_core::reactor::Handle; use tokio_io::codec::Framed; +use url::Url; use authentication::Credentials; use version; @@ -24,22 +23,12 @@ pub type Transport = Framed; pub fn connect( addr: String, handle: &Handle, - proxy: &Option, + proxy: &Option, ) -> Box> { let (addr, connect_url) = match *proxy { Some(ref url) => { - let url = Uri::from_str(url).expect("Malformed proxy address"); - let host = url.host().expect("Malformed proxy address: no host"); - let port = url.port().unwrap_or(3128); - - ( - format!("{}:{}", host, port) - .to_socket_addrs() - .unwrap() - .next() - .unwrap(), - Some(addr.clone()), - ) + info!("Using proxy \"{}\"", url); + (url.to_socket_addrs().unwrap().next().unwrap(), Some(addr)) } None => (addr.to_socket_addrs().unwrap().next().unwrap(), None), }; diff --git a/core/src/lib.rs b/core/src/lib.rs index e7b4b3c7..053e4191 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -30,6 +30,7 @@ extern crate serde_json; extern crate shannon; extern crate tokio_core; extern crate tokio_io; +extern crate url; extern crate uuid; extern crate librespot_protocol as protocol; diff --git a/core/src/proxytunnel.rs b/core/src/proxytunnel.rs index 3f1db053..5e07db99 100644 --- a/core/src/proxytunnel.rs +++ b/core/src/proxytunnel.rs @@ -96,7 +96,7 @@ impl Future for ProxyTunnel { } fn proxy_connect(connection: T, connect_url: &str) -> WriteAll> { - let uri = Uri::from_str(&connect_url).unwrap(); + let uri = Uri::from_str(connect_url).unwrap(); let buffer = format!( "CONNECT {0}:{1} HTTP/1.1\r\n\ \r\n", diff --git a/src/main.rs b/src/main.rs index b7654e1b..afca4c01 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ extern crate rpassword; extern crate tokio_core; extern crate tokio_io; extern crate tokio_signal; +extern crate url; use crypto::digest::Digest; use crypto::sha1::Sha1; @@ -23,6 +24,7 @@ use std::process::exit; use std::str::FromStr; use tokio_core::reactor::{Core, Handle}; use tokio_io::IoStream; +use url::Url; use librespot::core::authentication::{get_credentials, Credentials}; use librespot::core::cache::Cache; @@ -248,7 +250,23 @@ fn setup(args: &[String]) -> Setup { SessionConfig { user_agent: version::version_string(), device_id: device_id, - proxy: matches.opt_str("proxy").or(std::env::var("http_proxy").ok()), + proxy: matches.opt_str("proxy").or(std::env::var("http_proxy").ok()).map( + |s| { + match Url::parse(&s) { + Ok(url) => { + if url.host().is_none() || url.port().is_none() { + panic!("Invalid proxy url, only urls on the format \"http://host:port\" are allowed"); + } + + if url.scheme() != "http" { + panic!("Only unsecure http:// proxies are supported"); + } + url + }, + Err(err) => panic!("Invalid proxy url: {}, only urls on the format \"http://host:port\" are allowed", err) + } + }, + ), } }; From 96a69780163588524e270d984c88fe6589ef3263 Mon Sep 17 00:00:00 2001 From: Johan Anderholm Date: Fri, 23 Mar 2018 06:20:18 +0100 Subject: [PATCH 5/5] Update Cargo.lock librespot now require rust 1.21.0. error_chain is updated to avoid compilation warnings about unused rustdoc. --- .travis.yml | 2 +- Cargo.lock | 591 ++++++++++++++++++++++++++++++++++-------------- README.md | 2 +- core/Cargo.toml | 2 +- 4 files changed, 418 insertions(+), 179 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1316ffbd..7467a615 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: rust rust: - - 1.20.0 + - 1.21.0 - stable - beta - nightly diff --git a/Cargo.lock b/Cargo.lock index 7671881d..647cacf8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3 +1,10 @@ +[root] +name = "librespot-protocol" +version = "0.1.0" +dependencies = [ + "protobuf 1.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "aho-corasick" version = "0.6.4" @@ -11,7 +18,15 @@ name = "alsa" version = "0.0.1" source = "git+https://github.com/plietar/rust-alsa#8c63543fa0ccd971cf15f5675293d19febd6f79e" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "arrayvec" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -75,7 +90,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -83,6 +98,44 @@ name = "cfg-if" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crossbeam-deque" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-utils" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-utils" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "dns-parser" version = "0.3.2" @@ -98,7 +151,7 @@ name = "dns-sd" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -113,12 +166,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "error-chain" -version = "0.9.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -126,10 +179,10 @@ name = "extprim" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -148,7 +201,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -156,7 +209,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -167,7 +220,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "getopts" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -177,27 +230,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hyper" -version = "0.11.14" +version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "relay 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hyper-proxy" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.11.24 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "idna" version = "0.1.4" @@ -210,10 +276,10 @@ dependencies = [ [[package]] name = "iovec" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -230,7 +296,7 @@ dependencies = [ "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "jack-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -239,7 +305,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -283,7 +349,7 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.36" +version = "0.2.39" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -301,7 +367,7 @@ name = "libpulse-sys" version = "0.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -310,9 +376,9 @@ version = "0.1.0" dependencies = [ "base64 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "getopts 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.11.14 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.11.24 (registry+https://github.com/rust-lang/crates.io-index)", "librespot-audio 0.1.0", "librespot-connect 0.1.0", "librespot-core 0.1.0", @@ -320,18 +386,18 @@ dependencies = [ "librespot-playback 0.1.0", "librespot-protocol 0.1.0", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 1.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-signal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-signal 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -341,12 +407,12 @@ version = "0.1.0" dependencies = [ "bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "lewton 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "librespot-core 0.1.0", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tremor 0.1.0 (git+https://github.com/plietar/rust-tremor)", @@ -359,22 +425,22 @@ version = "0.1.0" dependencies = [ "base64 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-sd 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.11.14 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.11.24 (registry+https://github.com/rust-lang/crates.io-index)", "librespot-core 0.1.0", "librespot-playback 0.1.0", "librespot-protocol 0.1.0", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "mdns 0.2.0 (git+https://github.com/plietar/rust-mdns)", - "num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 1.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -384,26 +450,29 @@ dependencies = [ "base64 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "extprim 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.11.14 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.11.24 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper-proxy 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "librespot-protocol 0.1.0", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 1.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)", "shannon 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "uuid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -413,11 +482,11 @@ name = "librespot-metadata" version = "0.1.0" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "librespot-core 0.1.0", "librespot-protocol 0.1.0", "linear-map 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 1.4.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -426,9 +495,9 @@ version = "0.1.0" dependencies = [ "alsa 0.0.1 (git+https://github.com/plietar/rust-alsa)", "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "jack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "libpulse-sys 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "librespot-audio 0.1.0", "librespot-core 0.1.0", @@ -437,13 +506,6 @@ dependencies = [ "portaudio-rs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "librespot-protocol" -version = "0.1.0" -dependencies = [ - "protobuf 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "linear-map" version = "1.2.0" @@ -473,18 +535,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "mdns" version = "0.2.0" -source = "git+https://github.com/plietar/rust-mdns#c0fc73502d7d752a4ffeb5268a017561405e218c" +source = "git+https://github.com/plietar/rust-mdns#733b2b66d7ad4190e7a752e6e3cfeeb4b0627852" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.3.2 (git+https://github.com/plietar/dns-parser)", - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "multimap 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", "nix 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -492,9 +557,14 @@ name = "memchr" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memoffset" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "mime" version = "0.3.5" @@ -505,19 +575,19 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.12" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -526,8 +596,8 @@ name = "mio-uds" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -536,7 +606,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -548,14 +618,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "net2" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -565,32 +633,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "nodrop" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "num-bigint" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-integer" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.1.41" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-traits" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -598,7 +679,7 @@ name = "num_cpus" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -615,7 +696,7 @@ version = "0.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -635,7 +716,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "portaudio-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -644,13 +725,21 @@ name = "portaudio-sys" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "proc-macro2" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "protobuf" -version = "1.4.3" +version = "1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -663,13 +752,22 @@ name = "quote" version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "quote" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rand" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -678,7 +776,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -689,27 +787,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "regex" -version = "0.2.5" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.4.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "relay" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -718,7 +819,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -729,8 +830,8 @@ version = "0.2.36" source = "git+https://github.com/awmath/rust-crypto.git?branch=avx2#394c247254dbe2ac5d44483232cf335d10cf0260" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -761,7 +862,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "scoped-tls" -version = "0.1.0" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "scopeguard" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -784,10 +890,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.27" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -810,21 +916,22 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.27" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive_internals 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.12.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive_internals" -version = "0.19.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.12.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -834,7 +941,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -861,6 +968,18 @@ name = "smallvec" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "socket2" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "syn" version = "0.11.11" @@ -871,6 +990,16 @@ dependencies = [ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "syn" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "synom" version = "0.11.3" @@ -890,8 +1019,8 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -901,7 +1030,7 @@ name = "termios" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -918,34 +1047,60 @@ name = "time" version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-udp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-core" -version = "0.1.12" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "scoped-tls 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-executor" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-io" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -953,46 +1108,98 @@ name = "tokio-proto" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-reactor" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-service" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-signal" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-tcp" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-threadpool" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-deque 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-udp" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tremor" version = "0.1.0" source = "git+https://github.com/plietar/rust-tremor#5958cc302e78f535dad90e9665da981ddff4000a" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "tremor-sys 0.1.0 (git+https://github.com/plietar/rust-tremor)", ] @@ -1002,11 +1209,16 @@ version = "0.1.0" source = "git+https://github.com/plietar/rust-tremor#5958cc302e78f535dad90e9665da981ddff4000a" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "ogg-sys 0.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ucd-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unicase" version = "2.1.0" @@ -1033,6 +1245,11 @@ name = "unicode-xid" version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unreachable" version = "1.0.0" @@ -1043,7 +1260,7 @@ dependencies = [ [[package]] name = "url" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1061,7 +1278,7 @@ name = "uuid" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1088,9 +1305,9 @@ name = "vorbis" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "ogg-sys 0.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "vorbis-encoder 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "vorbis-sys 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "vorbisfile-sys 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1102,7 +1319,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "ogg-sys 0.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "vorbis-sys 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1114,7 +1331,7 @@ version = "0.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "ogg-sys 0.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1125,7 +1342,7 @@ version = "0.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)", "ogg-sys 0.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "vorbis-sys 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1172,6 +1389,7 @@ dependencies = [ [metadata] "checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" "checksum alsa 0.0.1 (git+https://github.com/plietar/rust-alsa)" = "" +"checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum base64 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "30e93c03064e7590d0466209155251b90c22e37fab1daf2771582598b5827557" "checksum base64 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "229d032f1a99302697f10b27167ae6d03d49d032e6a8e2550e8d3fc13356d2b4" "checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c" @@ -1183,22 +1401,27 @@ dependencies = [ "checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" "checksum bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1b7db437d718977f6dc9b2e3fd6fc343c02ac6b899b73fdd2179163447bd9ce9" "checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" +"checksum crossbeam-deque 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c1bdc73742c36f7f35ebcda81dbb33a7e0d33757d03a06d9ddca762712ec5ea2" +"checksum crossbeam-epoch 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9b4e2817eb773f770dcb294127c011e22771899c21d18fce7dd739c0b9832e81" +"checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" +"checksum crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d636a8b3bcc1b409d7ffd3facef8f21dcb4009626adbd0c5e6c4305c07253c7b" "checksum dns-parser 0.3.2 (git+https://github.com/plietar/dns-parser)" = "" "checksum dns-sd 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d748509dea20228f63ba519bf142ce2593396386125b01f5b0d6412dab972087" "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" "checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" -"checksum error-chain 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e92ecf0a508c8e074c0e6fa8fe0fa38414848ad4dfc4db6f74c5e9753330b248" +"checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" "checksum extprim 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eb09b6eb24a48a5c57729e4a60980bf538b3662c3bcec04b6c7908d7a0f3d9b9" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "118b49cac82e04121117cbd3121ede3147e885627d82c4546b87c702debb90c1" +"checksum futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f32b9e9aaa890fe8b9453b27ebbf3d11136a5ce59032500effd0e707bbcd80" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" -"checksum getopts 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "65922871abd2f101a2eb0eaebadc66668e54a87ad9c3dd82520b5f86ede5eff9" +"checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05" "checksum httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2f407128745b78abc95c0ffbe4e5d37427fdc0d45470710cfef8c44522a2e37" -"checksum hyper 0.11.14 (registry+https://github.com/rust-lang/crates.io-index)" = "f57f74deb81fb91b776012ed7605e96b1ffb88c4fd5c031ce5c90534b604a6e0" +"checksum hyper 0.11.24 (registry+https://github.com/rust-lang/crates.io-index)" = "df4dd5dae401458087396b6db7fabc4d6760aa456a5fa8e92bda549f39cae661" +"checksum hyper-proxy 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44f0925de2747e481e6e477dd212c25e8f745567f02f6182e04d27b97c3fbece" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" -"checksum iovec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6e8b9c2247fcf6c6a1151f1156932be5606c9fd6f55a2d7f9fc1cb29386b2f7" +"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c" "checksum jack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1e15fc592e2e5a74a105ff507083c04db1aa20ba1b90d425362ba000e57422df" "checksum jack-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0d4ca501477fd3cd93a36df581046e5d6338ed826cf7e9b8d302603521e6cc3" @@ -1208,7 +1431,7 @@ dependencies = [ "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" "checksum lewton 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d170da25c0b3541e3260f84aa8f9d323468083bd1ed6c4c15aec7ff33e2a1c4" -"checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)" = "f54263ad99207254cf58b5f701ecb432c717445ea2ee8af387334bdd1a03fdff" "checksum libloading 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fd38073de8f7965d0c17d30546d4bb6da311ab428d1c7a3fc71dff7f9d4979b9" "checksum libpulse-sys 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9bb11b06faf883500c1b625cf4453e6c7737e9df9c7ba01df3f84b22b083e4ac" "checksum linear-map 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" @@ -1217,16 +1440,19 @@ dependencies = [ "checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" "checksum mdns 0.2.0 (git+https://github.com/plietar/rust-mdns)" = "" "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" +"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e00e17be181010a91dbfefb01660b17311059dc8c7f48b9017677721e732bd" -"checksum mio 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "75f72a93f046f1517e3cfddc0a096eb756a2ba727d36edc8227dee769a50a9b0" +"checksum mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "6d771e3ef92d58a8da8df7d6976bfca9371ed1de6619d9d5a5ce5b1f29b85bfe" "checksum mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1731a873077147b626d89cc6c2a0db6288d607496c5d10c0cfcf3adc697ec673" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum multimap 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9223f4774d08e06185e44e555b9a7561243d387bac49c78a6205c42d6975fbf2" -"checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09" +"checksum net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)" = "9044faf1413a1057267be51b5afba8eb1090bd2231c693664aa1db716fe1eae0" "checksum nix 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "47e49f6982987135c5e9620ab317623e723bd06738fd85377e8d55f57c8b6487" -"checksum num-bigint 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "bdc1494b5912f088f260b775799468d9b9209ac60885d8186a547a0476289e23" -"checksum num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba" -"checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070" +"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" +"checksum num-bigint 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "81b483ea42927c463e191802e7334556b48e7875297564c0e9951bd3a0ae53e3" +"checksum num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f8d26da319fb45674985c78f1d1caf99aa4941f785d384a2ae36d0740bc3e2fe" +"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +"checksum num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dee092fcdf725aee04dd7da1d21debff559237d49ef1cb3e69bcb8ece44c7364" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum ogg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f8de5433300a8a0ba60a3207766a3ce9efdede6aaab23311b5a8cf1664fe2e9" "checksum ogg-sys 0.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "a95b8c172e17df1a41bf8d666301d3b2c4efeb90d9d0415e2a4dc0668b35fdb2" @@ -1234,55 +1460,68 @@ dependencies = [ "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903" "checksum portaudio-rs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "029e0ab393b44b2d825efbc755cae51c36be7a99d91356b2052be0ed05836636" "checksum portaudio-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5194a4fa953b4ffd851c320ef6f0484cd7278cb7169ea9d6c433e49b23f7b7f5" -"checksum protobuf 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bec26e67194b7d991908145fdf21b7cae8b08423d96dcb9e860cd31f854b9506" +"checksum proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cd07deb3c6d1d9ff827999c7f9b04cdfd66b1b17ae508e14fe47b620f2282ae0" +"checksum protobuf 1.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a06aeffc36f6abfaf86e6b5b350c5ab4ec81ed3d95215c17730e0e744dfdd2c5" "checksum quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eda5fe9b71976e62bc81b781206aaa076401769b2143379d3eb2118388babac4" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" -"checksum rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)" = "512870020642bb8c221bf68baa1b2573da814f6ccfe5c9699b1c303047abe9b1" +"checksum quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eca14c727ad12702eb4b6bfb5a232287dcf8385cb8ca83a3eeaf6519c44c408" +"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd" -"checksum regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "744554e01ccbd98fff8c457c3b092cd67af62a555a43bfe97ae8a0451f7799fa" -"checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" -"checksum relay 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f301bafeb60867c85170031bdb2fcf24c8041f33aee09e7b116a58d4e9f781c5" +"checksum regex 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "aec3f58d903a7d2a9dc2bf0e41a746f4530e0cab6b615494e058f67a3ef947fb" +"checksum regex-syntax 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b2550876c31dc914696a6c2e01cbce8afba79a93c8ae979d2fe051c0230b3756" +"checksum relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1576e382688d7e9deecea24417e350d3062d97e32e45d70b1cde65994ff1489a" "checksum rpassword 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ec4bdede957362ec6fdd550f7e79c6d14cad2bc26b2d062786234c6ee0cb27bb" "checksum rust-crypto 0.2.36 (git+https://github.com/awmath/rust-crypto.git?branch=avx2)" = "" "checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" -"checksum scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d" +"checksum scoped-tls 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8674d439c964889e2476f474a3bf198cc9e199e77499960893bac5de7e9218a4" +"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)" = "34b623917345a631dc9608d5194cc206b3fe6c3554cd1c75b937e55e285254af" -"checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526" +"checksum serde 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)" = "0e100d00fb985a5bf16b857a436450e404fa613de3321b2e383947a93cbd75df" "checksum serde_codegen_internals 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bc888bd283bd2420b16ad0d860e35ad8acb21941180a83a189bb2046f9d00400" "checksum serde_derive 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)" = "978fd866f4d4872084a81ccc35e275158351d3b9fe620074e7d7504b816b74ba" -"checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0" -"checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5" +"checksum serde_derive 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)" = "86daebd995aa948b069d886f2105f2425cd66103049855e45c15c58c573f12c5" +"checksum serde_derive_internals 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3f714f52a41e371c5e141e9dafcead60921349bec76b44d79000c88aba3cfc" "checksum serde_json 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ad8bcf487be7d2e15d3d543f04312de991d631cfe1b43ea0ade69e6a8a5b16a1" "checksum shannon 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7ea5b41c9427b56caa7b808cb548a04fb50bb5b9e98590b53f28064ff4174561" "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" "checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" "checksum smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c8cbcd6df1e117c2210e13ab5109635ad68a929fcbb8964dc965b76cb5ee013" +"checksum socket2 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "36b4896961171cd3317c7e9603d88f379f8c6e45342212235d356496680c68fd" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" +"checksum syn 0.12.14 (registry+https://github.com/rust-lang/crates.io-index)" = "8c5bc2d6ff27891209efa5f63e9de78648d7801f085e4653701a692ce938d6fd" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b157868d8ac1f56b64604539990685fa7611d8fa9e5476cf0c02cf34d32917c5" "checksum tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "11ce2fe9db64b842314052e2421ac61a73ce41b898dc8e3750398b219c5fc1e0" "checksum termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a" "checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" "checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098" -"checksum tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "52b4e32d8edbf29501aabb3570f027c6ceb00ccef6538f4bddba0200503e74e8" -"checksum tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "514aae203178929dbf03318ad7c683126672d4d96eccb77b29603d33c9e25743" +"checksum tokio 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "65bd27f59c223e7c9e406bcdadb453e143bcf1242e162ae6c0f0eb6d14487306" +"checksum tokio-core 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "799492ccba3d8ed5e41f2520a7cfd504cb65bbfe5fbbbd0012e335ae5f188051" +"checksum tokio-executor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3aca092a94dc6e736819347a990a86ed734a6543a9d6f817929fa4dc8c4334e2" +"checksum tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6af9eb326f64b2d6b68438e1953341e00ab3cf54de7e35d92bfc73af8555313a" "checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" +"checksum tokio-reactor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3cedc8e5af5131dc3423ffa4f877cce78ad25259a9a62de0613735a13ebc64b" "checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" -"checksum tokio-signal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "57c4031b97651d28c87a0a071e1c2809d70609d3120ce285b302eb7d52c96906" +"checksum tokio-signal 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e8f46863230f9a05cf52d173721ec391b9c5782a2465f593029922b8782b9ffe" +"checksum tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec9b094851aadd2caf83ba3ad8e8c4ce65a42104f7b94d9e6550023f0407853f" +"checksum tokio-threadpool 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2057ff8a75d33639f9ea1b4b85cb113c7bbf4e06d132f148521d12cb6daa1a22" +"checksum tokio-udp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "137bda266504893ac4774e0ec4c2108f7ccdbcb7ac8dced6305fe9e4e0b5041a" "checksum tremor 0.1.0 (git+https://github.com/plietar/rust-tremor)" = "" "checksum tremor-sys 0.1.0 (git+https://github.com/plietar/rust-tremor)" = "" +"checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -"checksum url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa35e768d4daf1d85733418a49fb42e10d7f633e394fccab4ab7aba897053fe2" +"checksum url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f808aadd8cfec6ef90e4a14eb46f24511824d1ac596b9682703c87056c8678b7" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" "checksum uuid 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7cfec50b0842181ba6e713151b72f4ec84a6a7e2c9c8a8a3ffc37bb1cd16b231" "checksum vergen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c3365f36c57e5df714a34be40902b27a992eeddb9996eca52d0584611cf885d" diff --git a/README.md b/README.md index bab26a7b..4ea5b520 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ If you wish to learn more about how librespot works overall, the best way is to If you run into a bug when using librespot, please search the existing issues before opening a new one. Chances are, we've encountered it before, and have provided a resolution. If not, please open a new one, and where possible, include the backtrace librespot generates on crashing, along with anything we can use to reproduce the issue, eg. the Spotify URI of the song that caused the crash. # Building -Rust 1.20.0 or later is required to build librespot. +Rust 1.21.0 or later is required to build librespot. **If you are building librespot on macOS, the homebrew provided rust may fail due to the way in which homebrew installs rust. In this case, uninstall the homebrew version of rust and use [rustup](https://www.rustup.rs/), and librespot should then build. This should have been fixed in more recent versions of Homebrew, but we're leaving this notice here as a warning.** diff --git a/core/Cargo.toml b/core/Cargo.toml index ed1206aa..ee8a9875 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -11,7 +11,7 @@ path = "../protocol" base64 = "0.5.0" byteorder = "1.0" bytes = "0.4" -error-chain = { version = "0.9.0", default_features = false } +error-chain = { version = "0.11.0", default_features = false } extprim = "1.5.1" futures = "0.1.8" httparse = "1.2.4"