1
0
Fork 0
mirror of https://git.sr.ht/~adnano/go-gemini synced 2024-05-12 14:36:06 +02:00

Guarantee that (*Response).Body is not nil

This commit is contained in:
Adnan Maolood 2021-01-15 15:15:16 -05:00
parent 2b17f3d8eb
commit 31de8d49b0
3 changed files with 17 additions and 6 deletions

5
doc.go
View File

@ -8,10 +8,7 @@ Client is a Gemini client.
if err != nil {
// handle error
}
if resp.Body != nil {
defer resp.Body.Close()
// ...
}
defer resp.Body.Close()
// ...
Server is a Gemini server.

View File

@ -145,10 +145,10 @@ func main() {
fmt.Println(err)
os.Exit(1)
}
defer resp.Body.Close()
// Handle response
if resp.Status.Class() == gemini.StatusClassSuccess {
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)

View File

@ -18,7 +18,10 @@ type Response struct {
// Meta should not be longer than 1024 bytes.
Meta string
// Body contains the response body for successful responses.
// Body represents the response body.
// Body is guaranteed to always be non-nil.
//
// The response body is streamed on demand as the Body field is read.
Body io.ReadCloser
// TLS contains information about the TLS connection on which the response
@ -83,11 +86,22 @@ func ReadResponse(rc io.ReadCloser) (*Response, error) {
if resp.Status.Class() == StatusClassSuccess {
resp.Body = newReadCloserBody(br, rc)
} else {
resp.Body = nopReadCloser{}
rc.Close()
}
return resp, nil
}
type nopReadCloser struct{}
func (nopReadCloser) Read(p []byte) (int, error) {
return 0, io.EOF
}
func (nopReadCloser) Close() error {
return nil
}
type readCloserBody struct {
br *bufio.Reader // used until empty
io.ReadCloser