/* 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); */ }
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; }