goProject/trunk/game/common/server_http/context.go
2025-01-15 17:36:12 +08:00

177 lines
3.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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,
}
}