goProject/trunk/game/common/server_http/context.go

177 lines
3.5 KiB
Go
Raw Normal View History

2025-01-15 17:36:12 +08:00
package server_http
import (
"encoding/json"
"framework/ipMgr"
"io/ioutil"
"net/http"
. "common/model"
"goutil/debugUtil"
"goutil/logUtil"
"goutil/webUtil"
"goutil/zlibUtil"
)
// 请求上下文对象
type Context struct {
// 请求对象
*http.Request
// 应答写对象
http.ResponseWriter
// 请求数据
requestBytes []byte
// 数据是否已经解析数据
ifDataParsed bool
// Form的数据是否已经解析
ifFormParsed bool
}
// 检查IP是否合法
func (this *Context) checkIP() *ResultStatus {
if debugUtil.IsDebug() == false && ipMgr.IsIpValid(webUtil.GetRequestIP(this.Request)) == false {
return InvalidIP
}
return Success
}
func (this *Context) GetFormValue(key string) (value string, exists bool) {
defer func() {
this.ifFormParsed = true
}()
if !this.ifFormParsed {
this.Request.ParseForm()
}
values := this.Form[key]
if values != nil && len(values) > 0 {
value = values[0]
exists = true
return
}
return
}
// 转换内容
func (this *Context) parseContent() error {
defer func() {
this.Body.Close()
this.ifDataParsed = true
}()
data, err := ioutil.ReadAll(this.Body)
if err != nil {
logUtil.ErrorLog("url:%s,读取数据出错,错误信息为:%s", this.RequestURI, err)
return err
}
this.requestBytes = data
return nil
}
// 获取请求字节数据
// 返回值:
// []byte:请求字节数组
// error:错误信息
func (this *Context) GetRequestBytes(isCompressed bool) (result []byte, exists bool, err error) {
if this.ifDataParsed == false {
this.parseContent()
}
data := this.requestBytes
if data == nil || len(data) <= 0 {
return
} else {
exists = true
}
if isCompressed {
result, err = zlibUtil.Decompress(data)
if err != nil {
logUtil.ErrorLog("解压缩请求数据失败:%s", err)
return
}
} else {
result = data
}
return
}
// 获取请求字符串数据
// 返回值:
// 请求字符串数据
func (this *Context) GetRequestString(isCompressed bool) (result string, exists bool, err error) {
var data []byte
data, exists, err = this.GetRequestBytes(isCompressed)
if err != nil || !exists {
return
}
result = string(data)
exists = true
return
}
// Unmarshal 反序列化
// moduleName:模块名称
// obj:反序列化结果数据
// isCompressed:数据是否已经被压缩
// 返回值:
// 错误对象
func (this *Context) Unmarshal(moduleName string, obj interface{}, isCompressed bool) (exists bool, err error) {
var data []byte
data, exists, err = this.GetRequestBytes(isCompressed)
if err != nil || !exists {
return
}
// 反序列化
if err = json.Unmarshal(data, &obj); err != nil {
logUtil.ErrorLog("Module:%s, 反序列化%s出错错误信息为%s", moduleName, string(data), err)
return
}
debugUtil.Printf("接收到GM登录数据data:%v", string(data))
return
}
// 输出字符串
func (this *Context) WriteString(result string) {
this.ResponseWriter.Write([]byte(result))
}
// 输出json数据
func (this *Context) WriteJson(result interface{}) {
if bytes, err := json.Marshal(result); err == nil {
this.ResponseWriter.Write(bytes)
}
}
// 跳转到其它页面
func (this *Context) RedirectTo(url string) {
this.ResponseWriter.Header().Set("Location", url)
this.ResponseWriter.WriteHeader(301)
}
// 新建API上下文对象
// request:请求对象
// responseWriter:应答写对象
// 返回值:
// *Context:上下文
func newContext(request *http.Request, responseWriter http.ResponseWriter) *Context {
return &Context{
Request: request,
ResponseWriter: responseWriter,
}
}