Skip to content

Commit bcebf07

Browse files
committed
make cache reusable
1 parent 8c482c9 commit bcebf07

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

utils.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,21 +209,21 @@ func (ut Utils) ToJSONString(obj interface{}) string {
209209
// If obj is not []byte, string, or io.Reader, it will be encoded as JSON.
210210
func (ut Utils) Write(obj interface{}) (writer func(io.Writer)) {
211211
lock := sync.Mutex{}
212-
var cache io.ReadWriter
212+
var cache []byte
213213
return func(w io.Writer) {
214214
lock.Lock()
215215
defer lock.Unlock()
216216

217217
ut.Helper()
218218

219219
if cache != nil {
220-
_, err := io.Copy(w, cache)
220+
_, err := w.Write(cache)
221221
ut.err(err)
222222
return
223223
}
224224

225-
cache = bytes.NewBuffer(nil)
226-
w = io.MultiWriter(cache, w)
225+
buf := bytes.NewBuffer(nil)
226+
w = io.MultiWriter(buf, w)
227227

228228
var err error
229229
switch v := obj.(type) {
@@ -237,6 +237,7 @@ func (ut Utils) Write(obj interface{}) (writer func(io.Writer)) {
237237
err = json.NewEncoder(w).Encode(v)
238238
}
239239
ut.err(err)
240+
cache = buf.Bytes()
240241
}
241242
}
242243

utils_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package got_test
22

33
import (
44
"bytes"
5+
"io"
56
"net/http"
67
"os"
8+
"sync"
79
"testing"
810

911
"github.com/ysmood/got"
@@ -116,3 +118,34 @@ func TestHelper(t *testing.T) {
116118
mut.Skipf("test skip")
117119
ut.Eq(m.msg, "test skip")
118120
}
121+
122+
func TestServe(t *testing.T) {
123+
ut := got.New(t)
124+
125+
key := ut.Srand(8)
126+
s := ut.Serve().Route("/", "", key)
127+
count := 30
128+
129+
wg := sync.WaitGroup{}
130+
wg.Add(count)
131+
132+
request := func() {
133+
req, err := http.NewRequest(http.MethodGet, s.URL(), nil)
134+
ut.E(err)
135+
136+
res, err := http.DefaultClient.Do(req)
137+
ut.E(err)
138+
139+
b, err := io.ReadAll(res.Body)
140+
ut.E(err)
141+
142+
ut.Eq(string(b), key)
143+
wg.Done()
144+
}
145+
146+
for i := 0; i < count; i++ {
147+
go request()
148+
}
149+
150+
wg.Wait()
151+
}

0 commit comments

Comments
 (0)