Request only sha from GitHub API
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
da90b45b67
commit
ee148689cb
@ -18,13 +18,11 @@ pub(crate) trait ApiResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
pub(crate) struct GitHubApiResponse {
|
pub(crate) struct GitHubApiResponse(String);
|
||||||
pub(crate) sha: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ApiResponse for GitHubApiResponse {
|
impl ApiResponse for GitHubApiResponse {
|
||||||
fn commit_ref(&self) -> &str {
|
fn commit_ref(&self) -> &str {
|
||||||
&self.sha
|
&self.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,6 +74,10 @@ pub(crate) trait Service: Sized {
|
|||||||
|
|
||||||
fn path() -> &'static str;
|
fn path() -> &'static str;
|
||||||
|
|
||||||
|
fn api_accept() -> Option<&'static str> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
fn redirect_url(user: &str, repo: &str, commit: &str, file: &str) -> String;
|
fn redirect_url(user: &str, repo: &str, commit: &str, file: &str) -> String;
|
||||||
|
|
||||||
fn request_head<S>(
|
fn request_head<S>(
|
||||||
@ -148,6 +150,10 @@ impl Service for Github {
|
|||||||
"github"
|
"github"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn api_accept() -> Option<&'static str> {
|
||||||
|
Some("application/vnd.github.3.sha")
|
||||||
|
}
|
||||||
|
|
||||||
fn raw_url(user: &str, repo: &str, commit: &str, file: &str) -> String {
|
fn raw_url(user: &str, repo: &str, commit: &str, file: &str) -> String {
|
||||||
format!(
|
format!(
|
||||||
"https://raw.githubusercontent.com/{}/{}/{}/{}",
|
"https://raw.githubusercontent.com/{}/{}/{}/{}",
|
||||||
@ -168,6 +174,45 @@ impl Service for Github {
|
|||||||
fn redirect_url(user: &str, repo: &str, commit: &str, file: &str) -> String {
|
fn redirect_url(user: &str, repo: &str, commit: &str, file: &str) -> String {
|
||||||
format!("/github/{}/{}/{}/{}", user, repo, commit, file)
|
format!("/github/{}/{}/{}/{}", user, repo, commit, file)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn request_head<S>(
|
||||||
|
mut response: ClientResponse<S>,
|
||||||
|
data: web::Path<FilePath>,
|
||||||
|
_client: web::Data<Client>,
|
||||||
|
cache: State,
|
||||||
|
) -> Box<dyn Future<Item = HttpResponse, Error = Error>>
|
||||||
|
where
|
||||||
|
S: 'static + Stream<Item = Bytes, Error = PayloadError>,
|
||||||
|
{
|
||||||
|
match response.status() {
|
||||||
|
StatusCode::OK => Box::new(
|
||||||
|
response
|
||||||
|
.body()
|
||||||
|
// .json::<Self::Response>()
|
||||||
|
.map(move |resp| {
|
||||||
|
let head = String::from_utf8_lossy(resp.as_ref());
|
||||||
|
if let Ok(mut cache) = cache.write() {
|
||||||
|
let key = data.to_key::<Self>();
|
||||||
|
cache.store(key, head.to_string());
|
||||||
|
}
|
||||||
|
HttpResponse::SeeOther()
|
||||||
|
.header(
|
||||||
|
LOCATION,
|
||||||
|
Self::redirect_url(&data.user, &data.repo, &head, &data.file)
|
||||||
|
.as_str(),
|
||||||
|
)
|
||||||
|
.set(CacheControl(vec![
|
||||||
|
CacheDirective::Public,
|
||||||
|
CacheDirective::MaxAge(REDIRECT_AGE.as_secs() as u32),
|
||||||
|
]))
|
||||||
|
.finish()
|
||||||
|
})
|
||||||
|
.from_err(),
|
||||||
|
) as Box<dyn Future<Item = HttpResponse, Error = Error>>,
|
||||||
|
code => Box::new(futures::future::ok(HttpResponse::build(code).finish()))
|
||||||
|
as Box<dyn Future<Item = HttpResponse, Error = Error>>,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) struct Bitbucket;
|
pub(crate) struct Bitbucket;
|
||||||
|
Loading…
Reference in New Issue
Block a user