func (c *Client) readResponse(conn *connection, rpcCall *call) error { // Read first 4 bytes to get total-length var totalLength int32 = -1 var totalLengthBytes [4]byte if _, err := conn.con.Read(totalLengthBytes[0:4]); err != nil { log.Fatal("conn.con.Read(totalLengthBytes)", err) return err } if err := gohadoop.ConvertBytesToFixed(totalLengthBytes[0:4], &totalLength); err != nil { log.Fatal("gohadoop.ConvertBytesToFixed(totalLengthBytes, &totalLength)", err) return err } var responseBytes []byte = make([]byte, totalLength) if _, err := conn.con.Read(responseBytes); err != nil { log.Fatal("conn.con.Read(totalLengthBytes)", err) return err } // Parse RpcResponseHeaderProto rpcResponseHeaderProto := hadoop_common.RpcResponseHeaderProto{} off, err := readDelimited(responseBytes[0:totalLength], &rpcResponseHeaderProto) if err != nil { log.Fatal("readDelimited(responseBytes, rpcResponseHeaderProto)", err) return err } //log.Println("Received rpcResponseHeaderProto = ", rpcResponseHeaderProto) err = c.checkRpcHeader(&rpcResponseHeaderProto) if err != nil { log.Fatal("c.checkRpcHeader failed", err) return err } if *rpcResponseHeaderProto.Status == hadoop_common.RpcResponseHeaderProto_SUCCESS { // Parse RpcResponseWrapper _, err = readDelimited(responseBytes[off:], rpcCall.response) } else { log.Println("RPC failed with status: ", rpcResponseHeaderProto.Status.String()) errorDetails := [4]string{rpcResponseHeaderProto.Status.String(), "ServerDidNotSetExceptionClassName", "ServerDidNotSetErrorMsg", "ServerDidNotSetErrorDetail"} if rpcResponseHeaderProto.ExceptionClassName != nil { errorDetails[0] = *rpcResponseHeaderProto.ExceptionClassName } if rpcResponseHeaderProto.ErrorMsg != nil { errorDetails[1] = *rpcResponseHeaderProto.ErrorMsg } if rpcResponseHeaderProto.ErrorDetail != nil { errorDetails[2] = rpcResponseHeaderProto.ErrorDetail.String() } err = errors.New(strings.Join(errorDetails[:], ":")) } return err }
func receiveSaslMessage(c *Client, conn *connection) (*hadoop_common.RpcSaslProto, error) { // Read first 4 bytes to get total-length var totalLength int32 = -1 var totalLengthBytes [4]byte if _, err := conn.con.Read(totalLengthBytes[0:4]); err != nil { log.Fatal("conn.con.Read(totalLengthBytes)", err) return nil, err } if err := gohadoop.ConvertBytesToFixed(totalLengthBytes[0:4], &totalLength); err != nil { log.Fatal("gohadoop.ConvertBytesToFixed(totalLengthBytes, &totalLength)", err) return nil, err } var responseBytes []byte = make([]byte, totalLength) if _, err := conn.con.Read(responseBytes); err != nil { log.Fatal("conn.con.Read(totalLengthBytes)", err) return nil, err } // Parse RpcResponseHeaderProto rpcResponseHeaderProto := hadoop_common.RpcResponseHeaderProto{} off, err := readDelimited(responseBytes[0:totalLength], &rpcResponseHeaderProto) if err != nil { log.Fatal("readDelimited(responseBytes, rpcResponseHeaderProto)", err) return nil, err } err = checkSaslRpcHeader(&rpcResponseHeaderProto) if err != nil { log.Fatal("checkSaslRpcHeader failed", err) return nil, err } var saslRpcMessage hadoop_common.RpcSaslProto if *rpcResponseHeaderProto.Status == hadoop_common.RpcResponseHeaderProto_SUCCESS { // Parse RpcResponseWrapper if _, err = readDelimited(responseBytes[off:], &saslRpcMessage); err != nil { log.Fatal("failed to read sasl response!") return nil, err } else { return &saslRpcMessage, nil } } else { log.Println("RPC failed with status: ", rpcResponseHeaderProto.Status.String()) errorDetails := [4]string{rpcResponseHeaderProto.Status.String(), "ServerDidNotSetExceptionClassName", "ServerDidNotSetErrorMsg", "ServerDidNotSetErrorDetail"} if rpcResponseHeaderProto.ExceptionClassName != nil { errorDetails[0] = *rpcResponseHeaderProto.ExceptionClassName } if rpcResponseHeaderProto.ErrorMsg != nil { errorDetails[1] = *rpcResponseHeaderProto.ErrorMsg } if rpcResponseHeaderProto.ErrorDetail != nil { errorDetails[2] = rpcResponseHeaderProto.ErrorDetail.String() } err = errors.New(strings.Join(errorDetails[:], ":")) return nil, err } }