func (cons *Socket) processConnection(conn net.Conn) { cons.AddWorker() defer cons.WorkerDone() defer conn.Close() buffer := shared.NewBufferedReader(socketBufferGrowSize, cons.flags, cons.offset, cons.delimiter) for cons.IsActive() && !cons.IsFuseBurned() { conn.SetReadDeadline(time.Now().Add(cons.readTimeout)) err := buffer.ReadAll(conn, cons.Enqueue) if err == nil { if err = cons.sendAck(conn, true); err == nil { continue // ### continue, all is well ### } } // Silently exit on disconnect/close if !cons.IsActive() || shared.IsDisconnectedError(err) { return // ### return, connection closed ### } // Ignore timeout related errors if netErr, isNetErr := err.(net.Error); isNetErr && netErr.Timeout() { continue // ### return, ignore timeouts ### } Log.Error.Print("Socket transfer failed: ", err) cons.sendAck(conn, false) // Parser errors do not drop the connection if err != shared.BufferDataInvalid { return // ### return, close connections ### } } }
func (prod *Socket) validate() bool { if prod.acknowledge == "" { return true } response := make([]byte, len(prod.acknowledge)) prod.connection.SetReadDeadline(time.Now().Add(prod.ackTimeout)) _, err := prod.connection.Read(response) if err != nil { Log.Error.Print("Socket response error: ", err) if shared.IsDisconnectedError(err) { prod.closeConnection() } return false } return string(response) == prod.acknowledge }