/** * Is the X-Alt header really holding a collection of IP:port (with possible * push alt-locs containing a prefixing GUID) or is it mistakenly called * X-Alt but is really an old X-Gnutella-Alternate-Location containing a * list of HTTP URLs. */ static bool huge_is_pure_xalt(const char *value, size_t len) { host_addr_t addr; /* * This is pure heuristics, knowing that if we return TRUE, we'll parse * the X-Alt header in the format that is emitted by the majority of * vendors. * * We try to avoid the more costly pattern_qsearch() call if we can, * and our heuristic should catch 99% of the cases. And pattern_qsearch() * should quickly return true if the X-Alt is not a collection of IP:port. */ if (is_strcaseprefix(value, "tls=")) return TRUE; if (string_to_host_addr(value, NULL, &addr)) return TRUE; if (pattern_qsearch(has_http_urls, value, len, 0, qs_any)) return FALSE; return TRUE; }
/** * Apply pattern matching on text, matching at the *beginning* of words. * Patterns are lazily compiled as needed, using pattern_compile_fast(). */ static gboolean entry_match(const char *text, size_t tlen, cpattern_t **pw, word_vec_t *wovec, size_t wn) { size_t i; for (i = 0; i < wn; i++) { size_t j, offset = 0, amount = wovec[i].amount; if (pw[i] == NULL) pw[i] = pattern_compile_fast(wovec[i].word, wovec[i].len); for (j = 0; j < amount; j++) { const char *pos; pos = pattern_qsearch(pw[i], text, tlen, offset, qs_begin); if (pos) offset = (pos - text) + pw[i]->len; else break; } if (j != amount) /* Word does not occur as many time as we want */ return FALSE; } return TRUE; }