use std::{path::Path, sync::mpsc::Sender};
use crate::bundle::Manifest;
use crate::*;
use super::UpdateSource;
#[derive(Clone)]
pub struct HttpSource {
url: String,
}
impl HttpSource {
pub fn new<S: AsRef<str>>(url: S) -> HttpSource {
HttpSource {
url: url.as_ref().to_owned(),
}
}
}
impl UpdateSource for HttpSource {
fn get_release_feed(&self, channel: &str, app: &Manifest, staged_user_id: &str) -> Result<VelopackAssetFeed, Error> {
let releases_name = format!("releases.{}.json", channel);
let path = self.url.trim_end_matches('/').to_owned() + "/";
let url = url::Url::parse(&path)?;
let mut releases_url = url.join(&releases_name)?;
releases_url.set_query(Some(
format!("localVersion={}&id={}&stagingId={}", app.version, app.id, staged_user_id).as_str(),
));
info!("Downloading releases for channel {} from: {}", channel, releases_url);
let json = download::download_url_as_string(releases_url.as_str())?;
let feed: VelopackAssetFeed = serde_json::from_str(&json)?;
Ok(feed)
}
fn download_release_entry(&self, asset: &VelopackAsset, local_file: &Path, progress_sender: Option<Sender<i16>>) -> Result<(), Error> {
let path = self.url.trim_end_matches('/').to_owned() + "/";
let url = url::Url::parse(&path)?;
let asset_url = url.join(&asset.FileName)?;
info!("About to download from URL '{}' to file '{:?}'", asset_url, local_file);
download::download_url_to_file(asset_url.as_str(), local_file, move |p| {
if let Some(progress_sender) = &progress_sender {
let _ = progress_sender.send(p);
}
})?;
Ok(())
}
}