1 Star 0 Fork 0

simple/simple.io

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
response_encoder.go 2.39 KB
一键复制 编辑 原始数据 按行查看 历史
simple 提交于 2024-10-08 18:48 +08:00 . fix(response_encode):
package http
import (
"errors"
"fmt"
"strconv"
)
// ResponseEncode 编码器, 把response编码为字节流并写入缓冲区
type ResponseEncode struct{}
func (r *ResponseEncode) Encode(response *Response) (err error) {
defer func() {
if e := recover(); e != nil {
err = errors.New(fmt.Sprintln("Error encoding response,", e))
}
}()
if response == nil {
return errors.New("response cannot be nil")
}
if response.BufWriter == nil {
return errors.New("response.BufWriter cannot be nil")
}
r.line(response)
r.header(response)
r.body(response)
return response.BufWriter.Flush()
}
func (r *ResponseEncode) line(response *Response) {
if err := response.BufWriter.WriteString(response.Proto + " "); err != nil {
panic(err)
}
if err := response.BufWriter.WriteString(strconv.Itoa(response.statusCode) + " "); err != nil {
panic(err)
}
if err := response.BufWriter.WriteString(response.statusText); err != nil {
panic(err)
}
if err := response.BufWriter.WriteBytes(crlf); err != nil {
panic(err)
}
}
func (r *ResponseEncode) header(response *Response) {
buffer := response.BufWriter.WriteBuffer()
if response.Server != "" {
if err := writeHeader(buffer, "Server", response.Server); err != nil {
panic(err)
}
}
if response.body != nil && response.body.size > 0 {
if err := writeHeader(buffer, "Content-Length", strconv.FormatInt(response.body.size, 10)); err != nil {
panic(err)
}
}
if response.Header != nil {
for name, values := range response.Header {
if values == nil || len(values) == 0 {
continue
}
for i := 0; i < len(values); i++ {
if name == "Cookie" {
r.cookie(response)
continue
}
if err := writeHeader(buffer, name, values[i]); err != nil {
panic(err)
}
}
}
}
if err := response.BufWriter.WriteBytes(crlf); err != nil {
panic(err)
}
}
// 编码cookie
func (r *ResponseEncode) cookie(response *Response) {
cookies := response.Cookies()
if cookies == nil {
return
}
for _, cookie := range cookies[:] {
if err := writeHeader(response.BufWriter.WriteBuffer(), "Set-Cookie", cookie.String()); err != nil {
panic(err)
}
}
}
func (r *ResponseEncode) body(response *Response) {
if response.body != nil && response.body.size > 0 {
if _, err := response.BufWriter.WriteBuffer().ReadFrom(response.body); err != nil {
panic(err)
}
}
}
func NewResponseEncode() *ResponseEncode {
return &ResponseEncode{}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/simple-set/simple.io.git
git@gitee.com:simple-set/simple.io.git
simple-set
simple.io
simple.io
v1.6.5

搜索帮助