Skip to content

Commit 78c4a59

Browse files
committed
Added JSON streaming callback
1 parent b8e9bcb commit 78c4a59

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

client.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"encoding/json"
66
"encoding/xml"
7+
"errors"
78
"fmt"
89
"io"
910
"mime"
@@ -47,6 +48,10 @@ type Client struct {
4748

4849
type ClientOpt func(*Client) error
4950

51+
// Callback for json stream events, return an error if you want to stop streaming
52+
// with an error and io.EOF if you want to stop streaming and return success
53+
type JsonStreamCallback func(v any) error
54+
5055
///////////////////////////////////////////////////////////////////////////////
5156
// GLOBALS
5257

@@ -302,8 +307,20 @@ func do(client *http.Client, req *http.Request, accept string, strict bool, out
302307
// Decode the body
303308
switch mimetype {
304309
case ContentTypeJson:
305-
if err := json.NewDecoder(response.Body).Decode(out); err != nil {
306-
return err
310+
// JSON decode is streamable
311+
dec := json.NewDecoder(response.Body)
312+
for {
313+
if err := dec.Decode(out); err == io.EOF {
314+
break
315+
} else if err != nil {
316+
return err
317+
} else if reqopts.jsonStreamCallback != nil {
318+
if err := reqopts.jsonStreamCallback(out); errors.Is(err, io.EOF) {
319+
break
320+
} else if err != nil {
321+
return err
322+
}
323+
}
307324
}
308325
case ContentTypeTextStream:
309326
if err := NewTextStream().Decode(response.Body, reqopts.textStreamCallback); err != nil {

pkg/multipart/multipart.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func NewMultipartEncoder(w io.Writer) *Encoder {
5555
}
5656
}
5757

58-
// NewFormEncoder creates a new encoder object, whichwrites
58+
// NewFormEncoder creates a new encoder object, which writes
5959
// application/x-www-form-urlencoded to the io.Writer
6060
func NewFormEncoder(w io.Writer) *Encoder {
6161
return &Encoder{

requestopts.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type requestOpts struct {
1717
*http.Request
1818
noTimeout bool // OptNoTimeout
1919
textStreamCallback TextStreamCallback // OptTextStreamCallback
20+
jsonStreamCallback JsonStreamCallback // OptJsonStreamCallback
2021
}
2122

2223
type RequestOpt func(*requestOpts) error
@@ -103,3 +104,11 @@ func OptTextStreamCallback(fn TextStreamCallback) RequestOpt {
103104
return nil
104105
}
105106
}
107+
108+
// OptJsonStreamCallback is called for each decoded JSON event
109+
func OptJsonStreamCallback(fn JsonStreamCallback) RequestOpt {
110+
return func(r *requestOpts) error {
111+
r.jsonStreamCallback = fn
112+
return nil
113+
}
114+
}

0 commit comments

Comments
 (0)