acceptor.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package http
  2. import (
  3. "errors"
  4. "net"
  5. "net/http"
  6. "rocommon"
  7. "rocommon/socket"
  8. "rocommon/util"
  9. "time"
  10. )
  11. var errNotFound = errors.New("404 Not found")
  12. var ErrUnknownOperation = errors.New("unknown http operation")
  13. type tcpKeepAliveListener struct {
  14. *net.TCPListener
  15. }
  16. func (this tcpKeepAliveListener) Accept() (net.Conn, error) {
  17. tc, err := this.AcceptTCP()
  18. if err != nil {
  19. return nil, err
  20. }
  21. tc.SetKeepAlive(true)
  22. tc.SetKeepAlivePeriod(3 * time.Minute)
  23. return tc, nil
  24. }
  25. type httpAcceptor struct {
  26. socket.NetContextSet
  27. socket.NetServerNodeProperty
  28. socket.NetProcessorRPC //事件处理相关
  29. sv *http.Server
  30. httpDir string
  31. httpRoot string
  32. listener net.Listener
  33. }
  34. func (this *httpAcceptor) Port() int {
  35. if this.listener == nil {
  36. return 0
  37. }
  38. return this.listener.Addr().(*net.TCPAddr).Port
  39. }
  40. func (this *httpAcceptor) Start() rocommon.ServerNode {
  41. //ServeHTTP
  42. this.sv = &http.Server{Addr: this.GetAddr(), Handler: this}
  43. ln, err := net.Listen("tcp", this.GetAddr())
  44. if err != nil {
  45. util.ErrorF("http.listen failed=%v", err)
  46. return this
  47. }
  48. this.listener = ln
  49. util.ErrorF("http.listen success")
  50. go func() {
  51. this.sv.Serve(tcpKeepAliveListener{this.listener.(*net.TCPListener)})
  52. if err != nil && err != http.ErrServerClosed {
  53. util.ErrorF("http.listen name=%v failed=%v", this.GetName(), err)
  54. }
  55. }()
  56. return this
  57. }
  58. func (this *httpAcceptor) Stop() {
  59. }
  60. func (this *httpAcceptor) TypeOfName() string {
  61. return "httpAcceptor"
  62. }
  63. func (this *httpAcceptor) ServeHTTP(res http.ResponseWriter, req *http.Request) {
  64. sess := newHttpSession(this, req, res)
  65. var msg interface{}
  66. var err error
  67. this.ProcEvent(&rocommon.RecvMsgEvent{Sess: sess, Message: msg})
  68. if sess.err != nil {
  69. err = sess.err
  70. http.Error(sess.resp, err.Error(), http.StatusInternalServerError)
  71. return
  72. }
  73. //todo...
  74. // .html
  75. }
  76. func init() {
  77. socket.RegisterServerNode(func() rocommon.ServerNode {
  78. node := &httpAcceptor{}
  79. return node
  80. })
  81. }