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