func doResponse(conn *tao.Conn) { defer conn.Close() if conn.Peer() == nil { verbose.Printf("netlog: connection from anonymous\n") } else { verbose.Printf("netlog: connection from peer %s\n", *conn.Peer()) } for { req, err := conn.ReadString() if err == io.EOF { fmt.Fprintf(os.Stderr, "netlog: connection closed\n") break } if err != nil { fmt.Fprintf(os.Stderr, "netlog: can't read: %s\n", err) break } verbose.Printf("netlog: got %s request\n", req) if req == "POST" { if conn.Peer() == nil { conn.WriteString("DENIED") break } verbose.Printf("netlog: peer is %s\n", *conn.Peer()) msg, err := conn.ReadString() if err != nil { conn.WriteString("BAD") break } e := &netlog.LogEntry{Prin: *conn.Peer(), Msg: msg} lock.Lock() log = append(log, e) lock.Unlock() conn.WriteString("OK") } else if req == "GET" { lock.RLock() t := log lock.RUnlock() conn.WriteString("OK") conn.WriteInt(len(t)) for _, e := range t { conn.WriteString(e.Prin.String()) conn.WriteString(e.Msg) } } else { conn.WriteString("BAD") break } } if conn.Peer() == nil { verbose.Printf("netlog: connection closed from anonymous\n") } else { verbose.Printf("netlog: connection closed from peer %s\n", *conn.Peer()) } }