You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

event_writer_conn.go 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package log
  4. import (
  5. "io"
  6. "net"
  7. )
  8. type WriterConnOption struct {
  9. Addr string
  10. Protocol string
  11. Reconnect bool
  12. ReconnectOnMsg bool
  13. }
  14. type eventWriterConn struct {
  15. *EventWriterBaseImpl
  16. connWriter connWriter
  17. }
  18. var _ EventWriter = (*eventWriterConn)(nil)
  19. func NewEventWriterConn(writerName string, writerMode WriterMode) EventWriter {
  20. w := &eventWriterConn{EventWriterBaseImpl: NewEventWriterBase(writerName, "conn", writerMode)}
  21. opt := writerMode.WriterOption.(WriterConnOption)
  22. w.connWriter = connWriter{
  23. ReconnectOnMsg: opt.ReconnectOnMsg,
  24. Reconnect: opt.Reconnect,
  25. Net: opt.Protocol,
  26. Addr: opt.Addr,
  27. }
  28. w.OutputWriteCloser = &w.connWriter
  29. return w
  30. }
  31. func init() {
  32. RegisterEventWriter("conn", NewEventWriterConn)
  33. }
  34. // below is copied from old code
  35. type connWriter struct {
  36. innerWriter io.WriteCloser
  37. ReconnectOnMsg bool
  38. Reconnect bool
  39. Net string `json:"net"`
  40. Addr string `json:"addr"`
  41. }
  42. var _ io.WriteCloser = (*connWriter)(nil)
  43. // Close the inner writer
  44. func (i *connWriter) Close() error {
  45. if i.innerWriter != nil {
  46. return i.innerWriter.Close()
  47. }
  48. return nil
  49. }
  50. // Write the data to the connection
  51. func (i *connWriter) Write(p []byte) (int, error) {
  52. if i.neededConnectOnMsg() {
  53. if err := i.connect(); err != nil {
  54. return 0, err
  55. }
  56. }
  57. if i.ReconnectOnMsg {
  58. defer i.innerWriter.Close()
  59. }
  60. return i.innerWriter.Write(p)
  61. }
  62. func (i *connWriter) neededConnectOnMsg() bool {
  63. if i.Reconnect {
  64. i.Reconnect = false
  65. return true
  66. }
  67. if i.innerWriter == nil {
  68. return true
  69. }
  70. return i.ReconnectOnMsg
  71. }
  72. func (i *connWriter) connect() error {
  73. if i.innerWriter != nil {
  74. _ = i.innerWriter.Close()
  75. i.innerWriter = nil
  76. }
  77. conn, err := net.Dial(i.Net, i.Addr)
  78. if err != nil {
  79. return err
  80. }
  81. if tcpConn, ok := conn.(*net.TCPConn); ok {
  82. err = tcpConn.SetKeepAlive(true)
  83. if err != nil {
  84. return err
  85. }
  86. }
  87. i.innerWriter = conn
  88. return nil
  89. }