Changeset 22 in code for trunk


Ignore:
Timestamp:
Feb 6, 2020, 8:11:35 PM (5 years ago)
Author:
contact
Message:

Maintain a list of downstream connections

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r15 r22  
    4343        irc        *irc.Conn
    4444        srv        *Server
     45        logger     Logger
     46
    4547        registered bool
    4648        closed     bool
     
    4850        username   string
    4951        realname   string
     52}
     53
     54func 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
     63func (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()
    5091}
    5192
     
    96137                return c.Close()
    97138        default:
     139                c.logger.Printf("unhandled message: %v", msg)
    98140                return newUnknownCommandError(msg.Command)
    99141        }
     
    163205                return c.Close()
    164206        default:
     207                c.logger.Printf("unhandled message: %v", msg)
    165208                return newUnknownCommandError(msg.Command)
    166209        }
    167210}
    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                         break
    178                 } 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 nil
    195                 }
    196         }
    197 
    198         return c.Close()
    199 }
  • trunk/server.go

    r21 r22  
    4242        Logger    Logger
    4343        Upstreams []Upstream // TODO: per-user
     44
     45        downstreamConns []*downstreamConn
    4446}
    4547
     
    6264func (s *Server) Serve(ln net.Listener) error {
    6365        for {
    64                 c, err := ln.Accept()
     66                netConn, err := ln.Accept()
    6567                if err != nil {
    6668                        return fmt.Errorf("failed to accept connection: %v", err)
    6769                }
    6870
     71                conn := newDownstreamConn(s, netConn)
     72                s.downstreamConns = append(s.downstreamConns, conn)
    6973                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)
    7276                        }
    7377                }()
Note: See TracChangeset for help on using the changeset viewer.