/**
   * Tests conditional ranges requests.
   *
   * @throws Exception
   */
  public void testConditionalRanges() throws Exception {
    Client client = new Client(Protocol.HTTP);

    // Test partial Get.
    Request request = new Request(Method.GET, "http://localhost:" + TEST_PORT + "/testGet");
    Response response = client.handle(request);
    Tag entityTag = response.getEntity().getTag();

    request.setRanges(Arrays.asList(new Range(1, Range.SIZE_MAX)));
    request.getConditions().setRangeTag(entityTag);
    response = client.handle(request);
    assertEquals(Status.SUCCESS_PARTIAL_CONTENT, response.getStatus());
    assertEquals("234567890", response.getEntity().getText());
    assertEquals(10, response.getEntity().getSize());
    assertEquals(9, response.getEntity().getAvailableSize());
    assertEquals(1, response.getEntity().getRange().getIndex());
    assertEquals(9, response.getEntity().getRange().getSize());

    entityTag = new Tag(entityTag.getName() + "-test");
    request.setRanges(Arrays.asList(new Range(1, Range.SIZE_MAX)));
    request.getConditions().setRangeTag(entityTag);
    response = client.handle(request);
    assertEquals(Status.SUCCESS_OK, response.getStatus());
    assertEquals("1234567890", response.getEntity().getText());
    client.stop();
  }
  @Override
  public Tag getSipIfMatch() {
    if (!sipIfMatchAdded) {
      String header =
          (getHeaders() == null) ? null : getHeaders().getValues(SipConstants.HEADER_SIP_IF_MATCH);

      if (header != null) {
        try {
          setSipIfMatch(Tag.parse(header));
        } catch (Exception e) {
          Context.getCurrentLogger().info(e.getMessage());
        }
      }

      sipIfMatchAdded = true;
    }

    return super.getSipIfMatch();
  }
  /**
   * Returns the condition data applying to this call.
   *
   * @return The condition data applying to this call.
   */
  @Override
  public Conditions getConditions() {
    Conditions result = super.getConditions();

    if (!this.conditionAdded) {
      if (getHeaders() != null) {
        // Extract the header values
        String ifMatchHeader = getHeaders().getValues(HeaderConstants.HEADER_IF_MATCH);
        String ifNoneMatchHeader = getHeaders().getValues(HeaderConstants.HEADER_IF_NONE_MATCH);
        Date ifModifiedSince = null;
        Date ifUnmodifiedSince = null;
        String ifRangeHeader = getHeaders().getFirstValue(HeaderConstants.HEADER_IF_RANGE, true);

        for (Header header : getHeaders()) {
          if (header.getName().equalsIgnoreCase(HeaderConstants.HEADER_IF_MODIFIED_SINCE)) {
            ifModifiedSince = HeaderReader.readDate(header.getValue(), false);
          } else if (header
              .getName()
              .equalsIgnoreCase(HeaderConstants.HEADER_IF_UNMODIFIED_SINCE)) {
            ifUnmodifiedSince = HeaderReader.readDate(header.getValue(), false);
          }
        }

        // Set the If-Modified-Since date
        if ((ifModifiedSince != null) && (ifModifiedSince.getTime() != -1)) {
          result.setModifiedSince(ifModifiedSince);
        }

        // Set the If-Unmodified-Since date
        if ((ifUnmodifiedSince != null) && (ifUnmodifiedSince.getTime() != -1)) {
          result.setUnmodifiedSince(ifUnmodifiedSince);
        }

        // Set the If-Match tags
        List<Tag> match = null;
        Tag current = null;
        if (ifMatchHeader != null) {
          try {
            HeaderReader<Object> hr = new HeaderReader<Object>(ifMatchHeader);
            String value = hr.readRawValue();

            while (value != null) {
              current = Tag.parse(value);

              // Is it the first tag?
              if (match == null) {
                match = new ArrayList<Tag>();
                result.setMatch(match);
              }

              // Add the new tag
              match.add(current);

              // Read the next token
              value = hr.readRawValue();
            }
          } catch (Exception e) {
            this.context
                .getLogger()
                .log(Level.INFO, "Unable to process the if-match header: " + ifMatchHeader);
          }
        }

        // Set the If-None-Match tags
        List<Tag> noneMatch = null;
        if (ifNoneMatchHeader != null) {
          try {
            HeaderReader<Object> hr = new HeaderReader<Object>(ifNoneMatchHeader);
            String value = hr.readRawValue();

            while (value != null) {
              current = Tag.parse(value);

              // Is it the first tag?
              if (noneMatch == null) {
                noneMatch = new ArrayList<Tag>();
                result.setNoneMatch(noneMatch);
              }

              noneMatch.add(current);

              // Read the next token
              value = hr.readRawValue();
            }
          } catch (Exception e) {
            this.context
                .getLogger()
                .log(
                    Level.INFO, "Unable to process the if-none-match header: " + ifNoneMatchHeader);
          }
        }

        if (ifRangeHeader != null && ifRangeHeader.length() > 0) {
          Tag tag = Tag.parse(ifRangeHeader);
          if (tag != null) {
            result.setRangeTag(tag);
          } else {
            Date date = HeaderReader.readDate(ifRangeHeader, false);
            result.setRangeDate(date);
          }
        }
      }

      this.conditionAdded = true;
    }

    return result;
  }