func (s *Server) Process(conn *transport.Conn) { req := new(pond.Request) if err := conn.ReadProto(req); err != nil { log.Printf("Error from Read: %s", err) return } from := &conn.Peer var reply *pond.Reply var messageFetched string if req.NewAccount != nil { reply = s.newAccount(from, req.NewAccount) } else if req.Deliver != nil { reply = s.deliver(from, req.Deliver) } else if req.Fetch != nil { reply, messageFetched = s.fetch(from, req.Fetch) } else if req.Upload != nil { reply = s.upload(from, conn, req.Upload) if reply == nil { // Connection will be handled by upload. return } } else if req.Download != nil { reply = s.download(conn, req.Download) if reply == nil { // Connection will be handled by download. return } } else if req.Revocation != nil { reply = s.revocation(from, req.Revocation) } else { reply = &pond.Reply{Status: pond.Reply_NO_REQUEST.Enum()} } if reply == nil { reply = &pond.Reply{} } if err := conn.WriteProto(reply); err != nil { log.Printf("Error from Write: %s", err) return } if err := conn.WaitForClose(); err != nil { log.Printf("Error from WaitForClose: %s", err) return } if len(messageFetched) > 0 { // We replied to a Fetch and the client successfully acked the // message by securely closing the connection. So we can mark // the message as delivered. s.confirmedDelivery(from, messageFetched) } s.Lock() needSweep := false now := time.Now() if s.lastSweepTime.IsZero() || now.Before(s.lastSweepTime) || now.Sub(s.lastSweepTime) > sweepInterval { s.lastSweepTime = now needSweep = true } s.Unlock() if needSweep { s.sweep() } }