- Timestamp:
- Feb 6, 2020, 8:11:35 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/downstream.go
r15 r22 43 43 irc *irc.Conn 44 44 srv *Server 45 logger Logger 46 45 47 registered bool 46 48 closed bool … … 48 50 username string 49 51 realname string 52 } 53 54 func newDownstreamConn(srv *Server, netConn net.Conn) *downstreamConn { 55 return &downstreamConn{ 56 net: netConn, 57 irc: irc.NewConn(netConn), 58 srv: srv, 59 logger: &prefixLogger{srv.Logger, fmt.Sprintf("downstream %q: ", netConn.RemoteAddr())}, 60 } 61 } 62 63 func (c *downstreamConn) readMessages() error { 64 c.logger.Printf("new connection") 65 defer c.Close() 66 67 for { 68 msg, err := c.irc.ReadMessage() 69 if err == io.EOF { 70 break 71 } else if err != nil { 72 return fmt.Errorf("failed to read IRC command: %v", err) 73 } 74 75 err = c.handleMessage(msg) 76 if ircErr, ok := err.(ircError); ok { 77 ircErr.Message.Prefix = c.srv.prefix() 78 if err := c.WriteMessage(ircErr.Message); err != nil { 79 return fmt.Errorf("failed to write IRC reply: %v", err) 80 } 81 } else if err != nil { 82 return fmt.Errorf("failed to handle IRC command %q: %v", msg.Command, err) 83 } 84 85 if c.closed { 86 return nil 87 } 88 } 89 90 return c.Close() 50 91 } 51 92 … … 96 137 return c.Close() 97 138 default: 139 c.logger.Printf("unhandled message: %v", msg) 98 140 return newUnknownCommandError(msg.Command) 99 141 } … … 163 205 return c.Close() 164 206 default: 207 c.logger.Printf("unhandled message: %v", msg) 165 208 return newUnknownCommandError(msg.Command) 166 209 } 167 210 } 168 169 func handleConn(s *Server, netConn net.Conn) error {170 s.Logger.Printf("Handling connection from %v", netConn.RemoteAddr())171 172 c := downstreamConn{net: netConn, irc: irc.NewConn(netConn), srv: s}173 defer c.Close()174 for {175 msg, err := c.irc.ReadMessage()176 if err == io.EOF {177 break178 } else if err != nil {179 return fmt.Errorf("failed to read IRC command: %v", err)180 }181 s.Logger.Printf("Downstream message: %v", msg)182 183 err = c.handleMessage(msg)184 if ircErr, ok := err.(ircError); ok {185 ircErr.Message.Prefix = s.prefix()186 if err := c.WriteMessage(ircErr.Message); err != nil {187 return fmt.Errorf("failed to write IRC reply: %v", err)188 }189 } else if err != nil {190 return fmt.Errorf("failed to handle IRC command %q: %v", msg.Command, err)191 }192 193 if c.closed {194 return nil195 }196 }197 198 return c.Close()199 } -
trunk/server.go
r21 r22 42 42 Logger Logger 43 43 Upstreams []Upstream // TODO: per-user 44 45 downstreamConns []*downstreamConn 44 46 } 45 47 … … 62 64 func (s *Server) Serve(ln net.Listener) error { 63 65 for { 64 c, err := ln.Accept()66 netConn, err := ln.Accept() 65 67 if err != nil { 66 68 return fmt.Errorf("failed to accept connection: %v", err) 67 69 } 68 70 71 conn := newDownstreamConn(s, netConn) 72 s.downstreamConns = append(s.downstreamConns, conn) 69 73 go func() { 70 if err := handleConn(s, c); err != nil {71 s.Logger.Printf("Error handling connection: %v", err)74 if err := conn.readMessages(); err != nil { 75 conn.logger.Printf("Error handling messages: %v", err) 72 76 } 73 77 }()
Note:
See TracChangeset
for help on using the changeset viewer.