43 lines
640 B
Go
43 lines
640 B
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
)
|
|
|
|
type lazyOpener struct {
|
|
url string
|
|
data []byte
|
|
err error
|
|
}
|
|
|
|
func (l *lazyOpener) init() {
|
|
res, err := http.Get(l.url)
|
|
l.err = err
|
|
if err == nil {
|
|
defer res.Body.Close()
|
|
if res.StatusCode == 200 {
|
|
l.data, l.err = ioutil.ReadAll(res.Body)
|
|
} else {
|
|
l.err = errors.New(res.Status)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (l *lazyOpener) Read(p []byte) (n int, err error) {
|
|
if l.data == nil && l.err == nil {
|
|
l.init()
|
|
}
|
|
if l.err != nil {
|
|
return 0, err
|
|
}
|
|
if len(l.data) == 0 {
|
|
return 0, io.EOF
|
|
}
|
|
copied := copy(p, l.data)
|
|
l.data = l.data[copied:]
|
|
return copied, nil
|
|
}
|