| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- package http
- import (
- "errors"
- "net"
- "net/http"
- "rocommon"
- "rocommon/socket"
- "rocommon/util"
- "time"
- )
- var errNotFound = errors.New("404 Not found")
- var ErrUnknownOperation = errors.New("unknown http operation")
- type tcpKeepAliveListener struct {
- *net.TCPListener
- }
- func (this tcpKeepAliveListener) Accept() (net.Conn, error) {
- tc, err := this.AcceptTCP()
- if err != nil {
- return nil, err
- }
- tc.SetKeepAlive(true)
- tc.SetKeepAlivePeriod(3 * time.Minute)
- return tc, nil
- }
- type httpAcceptor struct {
- socket.NetContextSet
- socket.NetServerNodeProperty
- socket.NetProcessorRPC //事件处理相关
- sv *http.Server
- httpDir string
- httpRoot string
- listener net.Listener
- }
- func (this *httpAcceptor) Port() int {
- if this.listener == nil {
- return 0
- }
- return this.listener.Addr().(*net.TCPAddr).Port
- }
- func (this *httpAcceptor) Start() rocommon.ServerNode {
- //ServeHTTP
- this.sv = &http.Server{Addr: this.GetAddr(), Handler: this}
- ln, err := net.Listen("tcp", this.GetAddr())
- if err != nil {
- util.ErrorF("http.listen failed=%v", err)
- return this
- }
- this.listener = ln
- util.ErrorF("http.listen success")
- go func() {
- this.sv.Serve(tcpKeepAliveListener{this.listener.(*net.TCPListener)})
- if err != nil && err != http.ErrServerClosed {
- util.ErrorF("http.listen name=%v failed=%v", this.GetName(), err)
- }
- }()
- return this
- }
- func (this *httpAcceptor) Stop() {
- }
- func (this *httpAcceptor) TypeOfName() string {
- return "httpAcceptor"
- }
- func (this *httpAcceptor) ServeHTTP(res http.ResponseWriter, req *http.Request) {
- sess := newHttpSession(this, req, res)
- var msg interface{}
- var err error
- this.ProcEvent(&rocommon.RecvMsgEvent{Sess: sess, Message: msg})
- if sess.err != nil {
- err = sess.err
- http.Error(sess.resp, err.Error(), http.StatusInternalServerError)
- return
- }
- //todo...
- // .html
- }
- func init() {
- socket.RegisterServerNode(func() rocommon.ServerNode {
- node := &httpAcceptor{}
- return node
- })
- }
|