aboutsummaryrefslogtreecommitdiff
path: root/util.go
diff options
context:
space:
mode:
Diffstat (limited to 'util.go')
-rw-r--r--util.go47
1 files changed, 20 insertions, 27 deletions
diff --git a/util.go b/util.go
index 0843cca..7da213c 100644
--- a/util.go
+++ b/util.go
@@ -206,16 +206,6 @@ func copyFile(src, dst string) (err error) {
if err != nil {
return
}
-
- si, err := os.Stat(src)
- if err != nil {
- return
- }
- err = os.Chmod(dst, si.Mode())
- if err != nil {
- return
- }
-
return
}
@@ -230,6 +220,7 @@ func getMetaFromDOI(client *http.Client, doi []byte) (*Meta, error) {
if err != nil {
return nil, err
}
+ defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("%q: failed to get metadata", u)
@@ -240,6 +231,7 @@ func getMetaFromDOI(client *http.Client, doi []byte) (*Meta, error) {
if err != nil {
return nil, err
}
+
r := bufio.NewReader(resp.Body)
d := xml.NewDecoder(r)
@@ -254,35 +246,38 @@ func getMetaFromDOI(client *http.Client, doi []byte) (*Meta, error) {
// getPaper saves makes an outbound request to a remote resource and saves the
// response body to a temporary file, returning its path, provided the response
// has the content-type application/pdf
-func getPaper(client *http.Client, u string) (string, error) {
+func getPaper(client *http.Client, scihub *url.URL, resource string) (string, error) {
- resp, err := makeRequest(client, u)
+ ref, err := url.Parse(resource)
if err != nil {
return "", err
}
+ refURL := scihub.ResolveReference(ref) // scihub + resource
+
+ resp, err := makeRequest(client, refURL.String())
+ if err != nil {
+ return "", err
+ }
+ defer resp.Body.Close()
doc, err := html.Parse(resp.Body)
if err != nil {
return "", err
}
- var dl *url.URL
+ var directLink *url.URL
var f func(*html.Node)
f = func(n *html.Node) {
- if n.Type == html.ElementNode && n.Data == "embed" {
+ if n.Type == html.ElementNode {
for _, a := range n.Attr {
if a.Key == "src" {
- _u, err := url.Parse(u)
- if err != nil {
- continue
- }
_v, err := url.Parse(a.Val)
if err != nil {
continue
}
if strings.HasSuffix(_v.Path, "pdf") {
- _u.Path = _v.Path
- dl = _u
+ directLink = scihub.ResolveReference(_v)
+ break
}
}
}
@@ -293,25 +288,23 @@ func getPaper(client *http.Client, u string) (string, error) {
}
f(doc)
- if dl == nil || dl.String() == "" {
- return "", fmt.Errorf("%q: could not locate PDF direct link", u)
+ if directLink == nil || directLink.String() == "" {
+ return "", fmt.Errorf("%q: could not locate PDF link", refURL.String())
}
- resp, err = makeRequest(client, dl.String())
+ resp, err = makeRequest(client, directLink.String())
if err != nil {
return "", err
}
-
+ defer resp.Body.Close()
if resp.Header.Get("content-type") != "application/pdf" {
- return "", fmt.Errorf("%q: parsed PDF direct link not application/pdf", u)
+ return "", fmt.Errorf("%q: content-type not application/pdf", refURL.String())
}
tmpPDF, err := ioutil.TempFile("", "tmp-*.pdf")
if err != nil {
return "", err
}
-
- // write resp.Body (paper data) to tmpPDF
if err := saveRespBody(resp, tmpPDF.Name()); err != nil {
return "", err
}