fix issue in empty check for nil attribute of struct in package 'empty';add set-cookie support for 302 status in ghttp.Server

This commit is contained in:
John
2019-03-05 17:06:37 +08:00
parent 37617589a6
commit 975da97b4a
7 changed files with 81 additions and 23 deletions

View File

@ -36,7 +36,10 @@ func IsEmpty(value interface{}) bool {
case []byte: return len(value) == 0
default:
// 最后通过反射来判断
rv := reflect.ValueOf(value)
rv := reflect.ValueOf(value)
if rv.IsNil() {
return true
}
kind := rv.Kind()
switch kind {
case reflect.Map: fallthrough

View File

@ -187,7 +187,8 @@ func (r *Response) ServeFileDownload(path string, name...string) {
r.Server.serveFile(r.request, path)
}
// 返回location标识引导客户端跳转
// 返回location标识引导客户端跳转
// 注意这里要先把设置的cookie输出否则会被忽略。
func (r *Response) RedirectTo(location string) {
r.Header().Set("Location", location)
r.WriteHeader(http.StatusFound)
@ -220,10 +221,19 @@ func (r *Response) ClearBuffer() {
r.buffer.Reset()
}
// 输出缓冲区数据到客户端
// Deprecated.
//
// 输出缓冲区数据到客户端.
func (r *Response) OutputBuffer() {
r.Header().Set("Server", r.Server.config.ServerAgent)
//r.handleGzip()
r.Writer.OutputBuffer()
}
// 输出缓冲区数据到客户端.
func (r *Response) Output() {
r.Header().Set("Server", r.Server.config.ServerAgent)
//r.handleGzip()
r.Writer.OutputBuffer()
}

View File

@ -25,16 +25,19 @@ func (w *ResponseWriter) Write(data []byte) (int, error) {
return len(data), nil
}
// 覆盖父级的WriteHeader方法
func (w *ResponseWriter) WriteHeader(code int) {
w.Status = code
w.ResponseWriter.WriteHeader(code)
// 覆盖父级的WriteHeader方法, 这里只会记录Status做缓冲处理, 并不会立即输出到HEADER。
func (w *ResponseWriter) WriteHeader(status int) {
w.Status = status
}
// 输出buffer数据到客户端
// 输出buffer数据到客户端.
func (w *ResponseWriter) OutputBuffer() {
if w.buffer.Len() > 0 {
w.ResponseWriter.Write(w.buffer.Bytes())
w.buffer.Reset()
}
if w.Status != 0 {
w.ResponseWriter.WriteHeader(w.Status)
}
}

View File

@ -147,7 +147,7 @@ var (
// 用于服务进程初始化,只能初始化一次,采用“懒初始化”(在server运行时才初始化)
serverProcessInited = gtype.NewBool()
// 是否开启WebServer平滑重启特性, 会开启额外的本地端口监听,用于进程管理通信
// 是否开启WebServer平滑重启特性, 会开启额外的本地端口监听,用于进程管理通信(默认开启)
gracefulEnabled = true
)

View File

@ -24,7 +24,7 @@ func (s *Server)defaultHttpHandle(w http.ResponseWriter, r *http.Request) {
s.handleRequest(w, r)
}
// 执行处理HTTP请求
// 执行处理HTTP请求
// 首先,查找是否有对应域名的处理接口配置;
// 其次,如果没有对应的自定义处理接口配置,那么走默认的域名处理接口配置;
// 最后,如果以上都没有找到处理接口,那么进行文件处理;
@ -55,12 +55,11 @@ func (s *Server)handleRequest(w http.ResponseWriter, r *http.Request) {
// 输出Cookie
request.Cookie.Output()
// 输出缓冲区
request.Response.OutputBuffer()
request.Response.Output()
// 事件 - AfterOutput
if !request.IsExited() {
s.callHookHandler(HOOK_AFTER_OUTPUT, request)
}
// 事件 - BeforeClose
s.callHookHandler(HOOK_BEFORE_CLOSE, request)
// access log
@ -92,7 +91,7 @@ func (s *Server)handleRequest(w http.ResponseWriter, r *http.Request) {
// 动态服务检索
handler := (*handlerItem)(nil)
if !request.IsFileRequest() || isStaticDir {
if !request.isFileRequest || isStaticDir {
if parsedItem := s.getServeHandlerWithCache(request); parsedItem != nil {
handler = parsedItem.handler
for k, v := range parsedItem.values {
@ -112,9 +111,9 @@ func (s *Server)handleRequest(w http.ResponseWriter, r *http.Request) {
// 执行静态文件服务/回调控制器/执行对象/方法
if !request.IsExited() {
// 需要再次判断文件是否真实存在,因为文件检索可能使用了缓存,从健壮性考虑这里需要二次判断
// 需要再次判断文件是否真实存在,
// 因为文件检索可能使用了缓存,从健壮性考虑这里需要二次判断
if request.isFileRequest /* && gfile.Exists(staticFile) */{
// 静态文件
s.serveFile(request, staticFile)
} else {
if handler != nil {

View File

@ -0,0 +1,33 @@
package main
import (
"github.com/gogf/gf/g"
"github.com/gogf/gf/g/frame/gmvc"
)
type Controller struct {
gmvc.Controller
}
func (c *Controller) Login() {
c.Session.Id()
c.Response.Write("这个页面用户填写信息执行登录")
}
func (c *Controller) DoLogin() {
c.Session.Set("key", "value")
//c.Response.Header().Set("Set-Cookie", "myid=1B27UGQGCIBP0P70; Path=/; Domain=127.0.0.1; Expires=Wed, 04 Mar 2020 07:12:05 GMT")
c.Response.RedirectTo("/main")
}
func (c *Controller) Main() {
c.Response.WriteJson(c.Session.Data())
}
func main() {
s := g.Server()
s.BindController("/", new(Controller))
s.SetPort(8199)
s.Run()
}

View File

@ -1,13 +1,23 @@
package main
import "fmt"
import (
"fmt"
"github.com/gogf/gf/g/util/gconv"
)
type User struct {
Id int
}
type RPCResponse struct {
ID interface{} `json:"id,omitempty"`
JsonRPC string `json:"jsonrpc"`
Error *User `json:"error,omitempty"`
Result interface{} `json:"result,omitempty"`
}
func main() {
for i := 0; i < 10; i++ {
switch 1 {
default:
//continue
}
fmt.Println(i)
}
var rpc RPCResponse
fmt.Println(rpc.Error)
fmt.Println(gconv.Map(rpc))
}