go-nntp-plusplus/examples/couchserver/lazyopen.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
}