private static boolean getComplete(Response response) {
   String bufferComplete = response.getHeader(PRESTO_BUFFER_COMPLETE);
   if (bufferComplete == null) {
     throw new PageTransportErrorException(format("Expected %s header", PRESTO_BUFFER_COMPLETE));
   }
   return Boolean.parseBoolean(bufferComplete);
 }
 private static long getNextToken(Response response) {
   String nextTokenHeader = response.getHeader(PRESTO_PAGE_NEXT_TOKEN);
   if (nextTokenHeader == null) {
     throw new PageTransportErrorException(format("Expected %s header", PRESTO_PAGE_NEXT_TOKEN));
   }
   return Long.parseLong(nextTokenHeader);
 }
 private static String getTaskInstanceId(Response response) {
   String taskInstanceId = response.getHeader(PRESTO_TASK_INSTANCE_ID);
   if (taskInstanceId == null) {
     throw new PageTransportErrorException(
         format("Expected %s header", PRESTO_TASK_INSTANCE_ID));
   }
   return taskInstanceId;
 }
 @Override
 public URI handle(Request request, Response response) {
   if (response.getStatusCode() != HttpStatus.CREATED.code()) {
     throw new UnexpectedResponseException(
         String.format(
             "Expected response code to be 201 CREATED, but was %s %s",
             response.getStatusCode(), response.getStatusMessage()),
         request,
         response);
   }
   String location = response.getHeader("Location");
   if (location == null) {
     throw new UnexpectedResponseException(
         "Response does not contain a Location header", request, response);
   }
   return URI.create(location);
 }
    @Override
    public PagesResponse handle(Request request, Response response) {
      // no content means no content was created within the wait period, but query is still ok
      // if job is finished, complete is set in the response
      if (response.getStatusCode() == HttpStatus.NO_CONTENT.code()) {
        return createEmptyPagesResponse(
            getTaskInstanceId(response),
            getToken(response),
            getNextToken(response),
            getComplete(response));
      }

      // otherwise we must have gotten an OK response, everything else is considered fatal
      if (response.getStatusCode() != HttpStatus.OK.code()) {
        StringBuilder body = new StringBuilder();
        try (BufferedReader reader =
            new BufferedReader(new InputStreamReader(response.getInputStream()))) {
          // Get up to 1000 lines for debugging
          for (int i = 0; i < 1000; i++) {
            String line = reader.readLine();
            // Don't output more than 100KB
            if (line == null || body.length() + line.length() > 100 * 1024) {
              break;
            }
            body.append(line + "\n");
          }
        } catch (RuntimeException | IOException e) {
          // Ignored. Just return whatever message we were able to decode
        }
        throw new PageTransportErrorException(
            format(
                "Expected response code to be 200, but was %s %s: %s%n%s",
                response.getStatusCode(),
                response.getStatusMessage(),
                request.getUri(),
                body.toString()));
      }

      // invalid content type can happen when an error page is returned, but is unlikely given the
      // above 200
      String contentType = response.getHeader(CONTENT_TYPE);
      if (contentType == null) {
        throw new PageTransportErrorException(
            format("%s header is not set: %s %s", CONTENT_TYPE, request.getUri(), response));
      }
      if (!mediaTypeMatches(contentType, PRESTO_PAGES_TYPE)) {
        throw new PageTransportErrorException(
            format(
                "Expected %s response from server but got %s: %s",
                PRESTO_PAGES_TYPE, contentType, request.getUri()));
      }

      String taskInstanceId = getTaskInstanceId(response);
      long token = getToken(response);
      long nextToken = getNextToken(response);
      boolean complete = getComplete(response);

      try (SliceInput input = new InputStreamSliceInput(response.getInputStream())) {
        List<Page> pages = ImmutableList.copyOf(readPages(blockEncodingSerde, input));
        return createPagesResponse(taskInstanceId, token, nextToken, pages, complete);
      } catch (IOException e) {
        throw Throwables.propagate(e);
      }
    }