Example #1
0
/* Verification code for: INKqa06643 */
static int
EventHandler(INKCont contp, INKEvent event, void *eData)
{
  INKHttpTxn txn = (INKHttpTxn) eData;
  int iVal;
  time_t tVal;

  if (time(&tVal) != (time_t) (-1)) {
    INKDebug("tag_sched6643", "INKContSchedule: EventHandler: called at %s\n", ctime(&tVal));
  }

  iVal = (int) INKContDataGet(contp);

  INKDebug("tag_sched6643", "INKContSchedule: handler called with value %d\n", iVal);

  switch (event) {

  case INK_EVENT_HTTP_OS_DNS:
    INKDebug("tag_sched6643", "INKContSchedule: Seed event %s\n", "INK_EVENT_HTTP_OS_DNS");
    break;

  case INK_EVENT_TIMEOUT:
    INKDebug("tag_sched6643", "INKContSchedule: TIMEOUT event\n");
    break;

  default:
    INKDebug("tag_sched6643", "INKContSchedule: Error: default event\n");
    break;
  }

  iVal += 100;                  /* seed + timeout val */
  INKContDataSet(contp, (void *) iVal);
  INKContSchedule(contp, iVal);

  /* INKHttpTxnReenable(txn, INK_EVENT_HTTP_CONTINUE); */
}
Example #2
0
static int
handle_cache_events(INKCont contp, INKEvent event, void *edata)
{
  CACHE_URL_DATA *url_data;
  INKVConn connp = (INKVConn) edata;
  char tempstr[32];

  LOG_SET_FUNCTION_NAME("handle_cache_events");

  url_data = (CACHE_URL_DATA *) INKContDataGet(contp);
  if (url_data == INK_ERROR_PTR) {
    LOG_ERROR_AND_RETURN("INKContDataGet");
  }

  if (event != INK_EVENT_HTTP_TXN_CLOSE) {
    INKReleaseAssert(url_data->magic == MAGIC_ALIVE);
  } else {
    INKReleaseAssert((url_data == NULL) || (url_data->magic == MAGIC_ALIVE));
  }

  switch (event) {
  case INK_EVENT_CACHE_OPEN_READ:
    /*handle_cache_read(); */
    INKDebug(DEBUG_TAG, "INK_EVENT_CACHE_OPEN_READ\n");

    if (url_data->pin_time != 0) {
      sprintf(tempstr, "PIN%d", url_data->pin_time);
    } else {
      sprintf(tempstr, "HIT");
    }
    insert_in_response(url_data->txnp, tempstr);

    if (url_data->pin_time != 0) {

      url_data->write_again_after_remove = 1;

      if (INKCacheRemove(contp, url_data->key) == INK_ERROR_PTR) {
        LOG_ERROR("INKCacheRemove");
        INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
        return -1;
      }
#ifdef DEBUG
      if (INKCacheRemove(NULL, url_data->key) != INK_ERROR_PTR) {
        LOG_ERROR_NEG("INKCacheRemove(NULL, cache_key)");
      }

      if (INKCacheRemove(contp, NULL) != INK_ERROR_PTR) {
        LOG_ERROR_NEG("INKCacheRemove(contp, NULL)");
      }
#endif
      return 0;
    }
#ifdef DEBUG
    if (INKVConnRead(NULL, contp, url_data->bufp, url_data->url_len) != INK_ERROR_PTR) {
      LOG_ERROR_NEG("INKVConnRead(NULL, contp, bufp, url_len)");
    }

    if (INKVConnRead(connp, NULL, url_data->bufp, url_data->url_len) != INK_ERROR_PTR) {
      LOG_ERROR_NEG("INKVConnRead(connp, NULL, bufp, url_len)");
    }

    if (INKVConnRead(connp, contp, NULL, url_data->url_len) != INK_ERROR_PTR) {
      LOG_ERROR_NEG("INKVConnRead(connp, contp, NULL, url_len)");
    }

    if (INKVConnRead(connp, contp, url_data->bufp, -1) != INK_ERROR_PTR) {
      LOG_ERROR_NEG("INKVConnRead(connp, contp, bufp, -1)");
    }
#endif

    if (INKVConnRead(connp, contp, url_data->bufp, url_data->url_len) == INK_ERROR_PTR) {
      LOG_ERROR("INKVConnRead");
      INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
      return -1;
    }

    break;

  case INK_EVENT_CACHE_OPEN_READ_FAILED:
    /*handle_cache_read_fail(); */
    INKDebug(DEBUG_TAG, "INK_EVENT_CACHE_OPEN_READ_FAILED(%d)\n", edata);

    if (url_data->pin_time != 0) {
      sprintf(tempstr, "PIN%d", url_data->pin_time);
    } else {
      sprintf(tempstr, "MISS");
    }
    insert_in_response(url_data->txnp, tempstr);

    if (url_data->pin_time != 0) {
      INKDebug(DEBUG_TAG, "url Pinned in cache for %d secs", url_data->pin_time);
      if (INKCacheKeyPinnedSet(url_data->key, url_data->pin_time) == INK_ERROR) {
        LOG_ERROR("INKCacheKeyPinnedSet");
        INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
        return -1;
      }
#ifdef DEBUG
      if (INKCacheKeyPinnedSet(NULL, url_data->pin_time) != INK_ERROR) {
        LOG_ERROR_NEG("INKCacheKeyPinnedSet(NULL, pin_time)");
      }

      if (INKCacheKeyPinnedSet(url_data->key, -1) != INK_ERROR) {
        LOG_ERROR_NEG("INKCacheKeyPinnedSet(cache_key, -1)");
      }
#endif
    }

    if (INKCacheWrite(contp, url_data->key) == INK_ERROR_PTR) {
      LOG_ERROR("INKCacheWrite");
      INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
      return -1;
    }
#ifdef DEBUG
    if (INKCacheWrite(contp, NULL) != INK_ERROR_PTR) {
      LOG_ERROR_NEG("INKCacheWrite(contp, NULL)");
    }

    if (INKCacheWrite(NULL, url_data->key) != INK_ERROR_PTR) {
      LOG_ERROR_NEG("INKCacheWrite(NULL, url_data->key)");
    }
#endif

    break;

  case INK_EVENT_CACHE_OPEN_WRITE:
    /*handle_cache_write(); */
    INKDebug(DEBUG_TAG, "INK_EVENT_CACHE_OPEN_WRITE\n");

    if (INKIOBufferWrite(url_data->bufp, url_data->url, url_data->url_len) == INK_ERROR) {
      LOG_ERROR("INKIOBufferWrite");
      INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
      return -1;
    }

    url_data->bufp_reader = INKIOBufferReaderAlloc(url_data->bufp);
    if (url_data->bufp_reader == INK_ERROR_PTR) {
      LOG_ERROR("INKIOBufferReaderAlloc");
      INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
      return -1;
    }
#ifdef DEBUG
    if (INKVConnWrite(NULL, contp, url_data->bufp_reader, url_data->url_len) != INK_ERROR_PTR) {
      LOG_ERROR_NEG("INKVConnWrite(NULL, contp, bufp_reader, url_len");
    }

    if (INKVConnWrite(connp, NULL, url_data->bufp_reader, url_data->url_len) != INK_ERROR_PTR) {
      LOG_ERROR_NEG("INKVConnWrite(connp, NULL, bufp_reader, url_len");
    }

    if (INKVConnWrite(connp, contp, NULL, url_data->url_len) != INK_ERROR_PTR) {
      LOG_ERROR_NEG("INKVConnWrite(connp, contp, NULL, url_len");
    }

    if (INKVConnWrite(connp, contp, url_data->bufp_reader, -1) != INK_ERROR_PTR) {
      LOG_ERROR_NEG("INKVConnWrite(connp, contp, bufp_reader, -1");
    }
#endif

    if (INKVConnWrite(connp, contp, url_data->bufp_reader, url_data->url_len) == INK_ERROR_PTR) {
      LOG_ERROR("INKVConnWrite");
      INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
      return -1;
    }

    break;

  case INK_EVENT_CACHE_OPEN_WRITE_FAILED:
    /*handle_cache_write_fail(); */
    INKDebug(DEBUG_TAG, "INK_EVENT_CACHE_OPEN_WRITE_FAILED(%d)\n", edata);
    INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);

    break;

  case INK_EVENT_CACHE_REMOVE:
    /*handle_cache_remove(); */
    INKDebug(DEBUG_TAG, "INK_EVENT_CACHE_REMOVE\n");

    if (url_data->write_again_after_remove != 0) {

      INKDebug(DEBUG_TAG, "url Pinned in cache for %d secs", url_data->pin_time);
      if (url_data->pin_time != 0) {
        if (INKCacheKeyPinnedSet(url_data->key, url_data->pin_time) == INK_ERROR) {
          LOG_ERROR("INKCacheKeyPinnedSet");
          INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
          return -1;
        }
      }

      if (INKCacheWrite(contp, url_data->key) == INK_ERROR_PTR) {
        LOG_ERROR("INKCacheWrite");
        INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
        return -1;
      }
    } else {
      INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
    }

    break;

  case INK_EVENT_CACHE_REMOVE_FAILED:
    /*handle_cache_remove_fail(); */
    INKDebug(DEBUG_TAG, "INK_EVENT_CACHE_REMOVE_FAILED(%d)\n", edata);
    INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
    break;

  case INK_EVENT_VCONN_READ_READY:
    INKDebug(DEBUG_TAG, "INK_EVENT_VCONN_READ_READY\n");

    if (INKVIOReenable(edata) == INK_ERROR) {
      LOG_ERROR("INKVIOReenable");
    }
#ifdef DEBUG
    if (INKVIOReenable(NULL) != INK_ERROR) {
      LOG_ERROR_NEG("INKVIOReenable");
    }
#endif

    break;

  case INK_EVENT_VCONN_WRITE_READY:
    INKDebug(DEBUG_TAG, "INK_EVENT_VCONN_WRITE_READY\n");

    if (INKVIOReenable(edata) == INK_ERROR) {
      LOG_ERROR("INKVIOReenable");
    }
#ifdef DEBUG
    if (INKVIOReenable(NULL) != INK_ERROR) {
      LOG_ERROR_NEG("INKVIOReenable");
    }
#endif

    break;

  case INK_EVENT_VCONN_READ_COMPLETE:
    INKDebug(DEBUG_TAG, "INK_EVENT_VCONN_READ_COMPLETE\n");
    {
      INKIOBufferBlock blk;
      char *src;
      char dst[MAX_URL_LEN];
      int avail;
      int url_len_from_cache;

      if ((connp = INKVIOVConnGet(edata)) == INK_ERROR_PTR) {
        LOG_ERROR("INKVIOVConnGet");
        INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
        return -1;
      }
#ifdef DEBUG
      if (INKVConnCacheObjectSizeGet(NULL, &url_len_from_cache) != INK_ERROR) {
        LOG_ERROR_NEG("INKVConnCacheObjectSizeGet(NULL, &size)");
      }

      if (INKVConnCacheObjectSizeGet(connp, NULL) != INK_ERROR) {
        LOG_ERROR_NEG("INKVConnCacheObjectSizeGet(inkvconn, NULL)");
      }
#endif

      if (INKVConnCacheObjectSizeGet(connp, &url_len_from_cache) == INK_ERROR) {
        LOG_ERROR("INKVConnCacheObjectSizeGet");
        INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
        return -1;
      }

      if (url_len_from_cache != url_data->url_len) {
        LOG_ERROR("INKVConnCacheObjectSizeGet-mismatch");
        INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
        return -1;
      }

      if ((connp = INKVIOVConnGet(edata)) == INK_ERROR_PTR) {
        LOG_ERROR("INKVIOVConnGet");
        INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
        return -1;
      }
#ifdef DEBUG
      if (INKVIOVConnGet(NULL) != INK_ERROR_PTR) {
        LOG_ERROR_NEG("INKVIOVConnGet(null)");
      }

      if (INKVConnClose(NULL) != INK_ERROR) {
        LOG_ERROR_NEG("INKVConnClose(NULL)");
      }
#endif

      if (INKVConnClose(connp) == INK_ERROR) {
        LOG_ERROR("INKVConnClose");
        INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
        return -1;
      }

      url_data = (CACHE_URL_DATA *) INKContDataGet(contp);
      INKReleaseAssert(url_data->magic == MAGIC_ALIVE);

      url_data->bufp_reader = INKIOBufferReaderAlloc(url_data->bufp);
      blk = INKIOBufferReaderStart(url_data->bufp_reader);
      if (blk == INK_ERROR_PTR) {
        LOG_ERROR("INKIOBufferReaderStart");
        INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
        return -1;
      }

      src = (char *) INKIOBufferBlockReadStart(blk, url_data->bufp_reader, &avail);
      /* FC: make sure we do not copy more than MAX_URL_LEN-1 bytes into dst */
      if (avail < 0) {
        avail = 0;
      }
      avail = (avail < MAX_URL_LEN - 1) ? avail : (MAX_URL_LEN - 1);
      strncpy(dst, src, avail);
      dst[avail] = '\0';

      if (strcmp(dst, url_data->url) != 0) {
        INKDebug(DEBUG_TAG, "URL in cache NO_MATCH\ndst=[%s]\nurl=[%s]\n", dst, url_data->url);
      }
    }
    INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);

    break;

  case INK_EVENT_VCONN_WRITE_COMPLETE:
    INKDebug(DEBUG_TAG, "INK_EVENT_VCONN_WRITE_COMPLETE\n");

    if ((connp = INKVIOVConnGet(edata)) == INK_ERROR_PTR) {
      LOG_ERROR("INKVIOVConnGet");
      INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
      return -1;
    }
#ifdef DEBUG
    if (INKVIOVConnGet(NULL) != INK_ERROR_PTR) {
      LOG_ERROR_NEG("INKVIOVConnGet(null)");
    }

    if (INKVConnClose(NULL) != INK_ERROR) {
      LOG_ERROR_NEG("INKVConnClose(NULL)");
    }
#endif

    if (INKVConnClose(connp) == INK_ERROR) {
      LOG_ERROR("INKVConnClose");
      INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
      return -1;
    }

    INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
    break;

  case INK_EVENT_VCONN_EOS:
    INKDebug(DEBUG_TAG, "INK_EVENT_VCONN_EOS\n");
    break;

  case INK_EVENT_ERROR:
    INKDebug(DEBUG_TAG, "INK_EVENT_ERROR\n");
    INKHttpTxnReenable(url_data->txnp, INK_EVENT_HTTP_CONTINUE);
    break;

  case INK_EVENT_HTTP_TXN_CLOSE:
    INKDebug(DEBUG_TAG, "INK_EVENT_HTTP_TXN_CLOSE\n");

    if (url_data == NULL) {
      INKHttpTxnReenable(edata, INK_EVENT_HTTP_CONTINUE);
      break;
    }

    if (url_data->url != NULL) {
      INKfree(url_data->url);
    }

    if (INKCacheKeyDestroy(url_data->key) == INK_ERROR) {
      LOG_ERROR("INKCacheKeyDestroy");
    }
#ifdef DEBUG
    if (INKCacheKeyDestroy(NULL) != INK_ERROR) {
      LOG_ERROR_NEG("INKCacheKeyDestroy(NULL)");
    }

    if (INKIOBufferDestroy(NULL) != INK_ERROR) {
      LOG_ERROR_NEG("INKIOBufferDestroy(NULL)");
    }
#endif

    if (INKIOBufferDestroy(url_data->bufp) == INK_ERROR) {
      LOG_ERROR("INKIOBufferDestroy");
    }

    url_data->magic = MAGIC_DEAD;
    INKfree(url_data);
    INKContDestroy(contp);
    INKHttpTxnReenable(edata, INK_EVENT_HTTP_CONTINUE);

    break;

  default:
    ;
  }
  return 0;
}