good morning!!!!

Skip to content
Snippets Groups Projects
Verified Commit 4fa189ce authored by a's avatar a
Browse files

noot

parent b1e5736b
Branches
Tags
No related merge requests found
...@@ -73,7 +73,7 @@ func (c *Client) listen() error { ...@@ -73,7 +73,7 @@ func (c *Client) listen() error {
defer jx.PutDecoder(jd) defer jx.PutDecoder(jd)
jd.Reset(c.rd) jd.Reset(c.rd)
for { for {
msg, err := jd.RawAppend(nil) msg, err := jd.Raw()
if err != nil { if err != nil {
return err return err
} }
......
...@@ -21,7 +21,7 @@ type IdReply struct { ...@@ -21,7 +21,7 @@ type IdReply struct {
} }
type msgOrError struct { type msgOrError struct {
msg io.ReadCloser msg io.Reader
err error err error
} }
...@@ -74,7 +74,7 @@ func (i *IdReply) remove(id []byte) { ...@@ -74,7 +74,7 @@ func (i *IdReply) remove(id []byte) {
delete(i.chs, string(id)) delete(i.chs, string(id))
} }
func (i *IdReply) Resolve(id []byte, msg io.ReadCloser, err error) { func (i *IdReply) Resolve(id []byte, msg io.Reader, err error) {
ch := i.makeOrTake(id) ch := i.makeOrTake(id)
if ch == nil { if ch == nil {
return return
...@@ -92,7 +92,7 @@ func (i *IdReply) Resolve(id []byte, msg io.ReadCloser, err error) { ...@@ -92,7 +92,7 @@ func (i *IdReply) Resolve(id []byte, msg io.ReadCloser, err error) {
} }
func (i *IdReply) Ask(ctx context.Context, id []byte) (io.ReadCloser, error) { func (i *IdReply) Ask(ctx context.Context, id []byte) (io.Reader, error) {
select { select {
case resp := <-i.makeOrTake(id): case resp := <-i.makeOrTake(id):
return resp.msg, resp.err return resp.msg, resp.err
......
...@@ -89,7 +89,7 @@ func MarshalMessage(m *Message, enc *jx.Encoder) (err error) { ...@@ -89,7 +89,7 @@ func MarshalMessage(m *Message, enc *jx.Encoder) (err error) {
return nil return nil
} }
func UnmarshalMessage(m *Message, dec *jx.Decoder) error { func UnmarshalMessage(m *Message, dec *jx.Decoder, doCopy bool) error {
err := dec.Obj(func(d *jx.Decoder, key string) (err error) { err := dec.Obj(func(d *jx.Decoder, key string) (err error) {
switch key { switch key {
default: default:
...@@ -97,6 +97,9 @@ func UnmarshalMessage(m *Message, dec *jx.Decoder) error { ...@@ -97,6 +97,9 @@ func UnmarshalMessage(m *Message, dec *jx.Decoder) error {
if err != nil { if err != nil {
return err return err
} }
if doCopy {
raw = append([]byte(nil), raw...)
}
if m.Extensions == nil { if m.Extensions == nil {
m.Extensions = make(map[string]json.RawMessage) m.Extensions = make(map[string]json.RawMessage)
} }
...@@ -123,17 +126,22 @@ func UnmarshalMessage(m *Message, dec *jx.Decoder) error { ...@@ -123,17 +126,22 @@ func UnmarshalMessage(m *Message, dec *jx.Decoder) error {
case "method": case "method":
m.Method, err = d.Str() m.Method, err = d.Str()
case "params": case "params":
val, err := d.RawAppend(nil) val, err := d.Raw()
if err != nil { if err != nil {
return err return err
} }
if doCopy {
val = append([]byte(nil), val...)
}
m.Params = json.RawMessage(val) m.Params = json.RawMessage(val)
case "result": case "result":
// allocate full result :) val, err := d.Raw()
val, err := d.RawAppend(nil)
if err != nil { if err != nil {
return err return err
} }
if doCopy {
val = append([]byte(nil), val...)
}
m.Result = io.NopCloser(bytes.NewBuffer(val)) m.Result = io.NopCloser(bytes.NewBuffer(val))
case "error": case "error":
val, err := d.Raw() val, err := d.Raw()
...@@ -158,7 +166,7 @@ func (m *Message) UnmarshalJSON(xs []byte) error { ...@@ -158,7 +166,7 @@ func (m *Message) UnmarshalJSON(xs []byte) error {
dec := jx.GetDecoder() dec := jx.GetDecoder()
defer jx.PutDecoder(dec) defer jx.PutDecoder(dec)
dec.ResetBytes(xs) dec.ResetBytes(xs)
return UnmarshalMessage(m, dec) return UnmarshalMessage(m, dec, true)
} }
func (m Message) MarshalJSON() ([]byte, error) { func (m Message) MarshalJSON() ([]byte, error) {
...@@ -220,18 +228,22 @@ func IsBatchMessage(raw json.RawMessage) bool { ...@@ -220,18 +228,22 @@ func IsBatchMessage(raw json.RawMessage) bool {
// is called. Any non-JSON-RPC messages in the input return the zero value of // is called. Any non-JSON-RPC messages in the input return the zero value of
// Message. // Message.
func ParseMessage(in json.RawMessage) ([]*Message, bool) { func ParseMessage(in json.RawMessage) ([]*Message, bool) {
return ReadMessage(jx.DecodeBytes(in)) return ReadMessage(jx.DecodeBytes(in), true)
}
func ParseMessageCopyless(in json.RawMessage) ([]*Message, bool) {
return ReadMessage(jx.DecodeBytes(in), false)
} }
// parseMessage parses raw bytes as a (batch of) JSON-RPC message(s). There are no error // parseMessage parses raw bytes as a (batch of) JSON-RPC message(s). There are no error
// checks in this function because the raw message has already been syntax-checked when it // checks in this function because the raw message has already been syntax-checked when it
// is called. Any non-JSON-RPC messages in the input return the zero value of // is called. Any non-JSON-RPC messages in the input return the zero value of
// Message. // Message.
func ReadMessage(dec *jx.Decoder) ([]*Message, bool) { func ReadMessage(dec *jx.Decoder, doCopy bool) ([]*Message, bool) {
msgs := []*Message{{}} msgs := []*Message{{}}
switch dec.Next() { switch dec.Next() {
case jx.Object: case jx.Object:
_ = UnmarshalMessage(msgs[0], dec) _ = UnmarshalMessage(msgs[0], dec, doCopy)
return msgs, false return msgs, false
default: default:
return msgs, false return msgs, false
...@@ -239,12 +251,7 @@ func ReadMessage(dec *jx.Decoder) ([]*Message, bool) { ...@@ -239,12 +251,7 @@ func ReadMessage(dec *jx.Decoder) ([]*Message, bool) {
msgs = []*Message{} msgs = []*Message{}
dec.Arr(func(d *jx.Decoder) error { dec.Arr(func(d *jx.Decoder) error {
msg := new(Message) msg := new(Message)
// err := UnmarshalMessage(msg, d) err := UnmarshalMessage(msg, d, doCopy)
raw, err := d.Raw()
if err != nil {
raw = []byte{}
}
err = json.Unmarshal(raw, msg)
if err != nil { if err != nil {
msg = nil msg = nil
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment