代码拉取完成,页面将自动刷新
package payload
import (
"bytes"
"encoding/base64"
"io"
"gitee.com/ibisheng/go-socket.io/engineio/frame"
"gitee.com/ibisheng/go-socket.io/engineio/packet"
)
type writerFeeder interface {
getWriter() (io.Writer, error)
putWriter(error) error
}
type encoder struct {
supportBinary bool
feeder writerFeeder
ft frame.Type
pt packet.Type
header bytes.Buffer
frameCache bytes.Buffer
b64Writer io.WriteCloser
rawWriter io.Writer
}
func (e *encoder) NOOP() []byte {
if e.supportBinary {
return []byte{0x00, 0x01, 0xff, '6'}
}
return []byte("1:6")
}
func (e *encoder) NextWriter(ft frame.Type, pt packet.Type) (io.WriteCloser, error) {
w, err := e.feeder.getWriter()
if err != nil {
return nil, err
}
e.rawWriter = w
e.ft = ft
e.pt = pt
e.frameCache.Reset()
if !e.supportBinary && ft == frame.Binary {
e.b64Writer = base64.NewEncoder(base64.StdEncoding, &e.frameCache)
} else {
e.b64Writer = nil
}
return e, nil
}
func (e *encoder) Write(p []byte) (int, error) {
if e.b64Writer != nil {
return e.b64Writer.Write(p)
}
return e.frameCache.Write(p)
}
func (e *encoder) Close() error {
if e.b64Writer != nil {
e.b64Writer.Close()
}
var writeHeader func() error
if e.supportBinary {
writeHeader = e.writeBinaryHeader
} else {
if e.ft == frame.Binary {
writeHeader = e.writeB64Header
} else {
writeHeader = e.writeTextHeader
}
}
e.header.Reset()
err := writeHeader()
if err == nil {
_, err = e.header.WriteTo(e.rawWriter)
}
if err == nil {
_, err = e.frameCache.WriteTo(e.rawWriter)
}
if werr := e.feeder.putWriter(err); werr != nil {
return werr
}
return err
}
func (e *encoder) writeTextHeader() error {
l := int64(e.frameCache.Len() + 1) // length for packet type
err := writeTextLen(l, &e.header)
if err == nil {
err = e.header.WriteByte(e.pt.StringByte())
}
return err
}
func (e *encoder) writeB64Header() error {
l := int64(e.frameCache.Len() + 2) // length for 'b' and packet type
err := writeTextLen(l, &e.header)
if err == nil {
err = e.header.WriteByte('b')
}
if err == nil {
err = e.header.WriteByte(e.pt.StringByte())
}
return err
}
func (e *encoder) writeBinaryHeader() error {
l := int64(e.frameCache.Len() + 1) // length for packet type
b := e.pt.StringByte()
if e.ft == frame.Binary {
b = e.pt.BinaryByte()
}
err := e.header.WriteByte(e.ft.Byte())
if err == nil {
err = writeBinaryLen(l, &e.header)
}
if err == nil {
err = e.header.WriteByte(b)
}
return err
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。