| 619 | } |
| 620 | |
| 621 | static void |
| 622 | add_header(TSHttpTxn txn, const char *const header, invalidate_t *const rule) |
| 623 | { |
| 624 | TSMBuffer bufp = NULL; |
| 625 | TSMLoc lochdr = TS_NULL_MLOC; |
| 626 | TSMLoc locfield = TS_NULL_MLOC; |
| 627 | char rulestr[LINE_MAX]; |
| 628 | int rulelen = 0; |
| 629 | char encstr[LINE_MAX]; |
| 630 | size_t enclen = 0; |
| 631 | |
| 632 | TSReleaseAssert(header && rule); |
| 633 | |
| 634 | if (TS_SUCCESS != TSHttpTxnClientReqGet(txn, &bufp, &lochdr)) { |
| 635 | Dbg(dbg_ctl, "Unable to get client request from transaction"); |
| 636 | } |
| 637 | |
| 638 | rulelen = |
| 639 | snprintf(rulestr, sizeof(rulestr), "%s %jd %s", rule->regex_text, (intmax_t)rule->expiry, strForResult(rule->new_result)); |
| 640 | |
| 641 | if (TS_SUCCESS != TSStringPercentEncode(rulestr, rulelen, encstr, sizeof(encstr), &enclen, NULL)) { |
| 642 | Dbg(dbg_ctl, "Unable to get encode matching rule '%s'", rulestr); |
| 643 | return; |
| 644 | } |
| 645 | |
| 646 | locfield = TSMimeHdrFieldFind(bufp, lochdr, header, strlen(header)); |
| 647 | |
| 648 | if (TS_NULL_MLOC == locfield) { // create header |
| 649 | if (TS_SUCCESS == TSMimeHdrFieldCreateNamed(bufp, lochdr, header, strlen(header), &locfield)) { |
| 650 | if (TS_SUCCESS == TSMimeHdrFieldValueStringSet(bufp, lochdr, locfield, -1, encstr, enclen)) { |
| 651 | TSMimeHdrFieldAppend(bufp, lochdr, locfield); |
| 652 | Dbg(dbg_ctl, "Added header %s: '%.*s'", header, (int)enclen, encstr); |
| 653 | } |
| 654 | } |
| 655 | TSHandleMLocRelease(bufp, lochdr, locfield); |
| 656 | } else { // replace header |
| 657 | bool first = true; |
| 658 | while (locfield) { |
| 659 | const TSMLoc tmp = TSMimeHdrFieldNextDup(bufp, lochdr, locfield); |
| 660 | if (first) { |
| 661 | first = false; |
| 662 | TSMimeHdrFieldValueStringSet(bufp, lochdr, locfield, -1, encstr, enclen); |
| 663 | Dbg(dbg_ctl, "Added header '%s': '%.*s'", header, (int)enclen, encstr); |
| 664 | } else { |
| 665 | TSMimeHdrFieldDestroy(bufp, lochdr, locfield); |
| 666 | } |
| 667 | TSHandleMLocRelease(bufp, lochdr, locfield); |
| 668 | locfield = tmp; |
| 669 | } |
| 670 | } |
| 671 | } |
| 672 | |
| 673 | static int |
| 674 | main_handler(TSCont cont, TSEvent event, void *edata) |
no test coverage detected