static int mangle_http_header(const struct sk_buff *skb, int flags) { struct iphdr *iph = (skb)->nh.iph; struct tcphdr *tcph = (void *)iph + iph->ihl*4; unsigned char *data = (void *)tcph + tcph->doff*4; unsigned int datalen = (skb)->len - (iph->ihl*4) - (tcph->doff*4); int found, offset, len; int ret = 0; SPARQ_LOG("%s: seq=%u\n", __FUNCTION__, ntohl(tcph->seq)); /* Basic checking, is it HTTP packet? */ if (datalen < 10) return ret; /* Not enough length, ignore it */ if (memcmp(data, "GET ", sizeof("GET ") - 1) != 0 && memcmp(data, "POST ", sizeof("POST ") - 1) != 0 && memcmp(data, "HEAD ", sizeof("HEAD ") - 1) != 0) //zg add 2006.09.28 for cdrouter3.3 item 186(cdrouter_urlfilter_15) return ret; /* Pass it */ /* COOKIE modification */ if (flags & HTTP_COOKIE) { found = find_pattern2(data, datalen, "Cookie: ", sizeof("Cookie: ")-1, '\r', &offset, &len); if (found) { char c; offset -= (sizeof("Cookie: ") - 1); /* Swap the 2rd and 4th bit */ c = *(data + offset + 2) ; *(data + offset + 2) = *(data + offset + 4) ; *(data + offset + 4) = c ; ret++; } } return ret; }
static int get_http_info(const struct sk_buff *skb, int flags, httpinfo_t *info) { struct iphdr *iph = ip_hdr(skb); struct tcphdr *tcph = (void *)iph + iph->ihl*4; unsigned char *data = (void *)tcph + tcph->doff*4; unsigned int datalen = (skb)->len - (iph->ihl*4) - (tcph->doff*4); int found, offset; int hostlen, pathlen; int ret = 0; SPARQ_LOG("%s: seq=%u\n", __FUNCTION__, ntohl(tcph->seq)); /* Basic checking, is it HTTP packet? */ if (datalen < 10) return ret; /* Not enough length, ignore it */ if (memcmp(data, "GET ", sizeof("GET ") - 1) != 0 && memcmp(data, "POST ", sizeof("POST ") - 1) != 0) return ret; /* Pass it */ if (!(flags & (HTTP_HOST | HTTP_URL))) return ret; /* find the 'Host: ' value */ found = find_pattern2(data, datalen, "Host: ", sizeof("Host: ") - 1, '\r', &offset, &hostlen); SPARQ_LOG("Host found=%d\n", found); if (!found || !hostlen) return ret; ret++; /* Host found, increase the return value */ hostlen = (hostlen < BUFSIZE) ? hostlen : BUFSIZE; strncpy(info->host, data + offset, hostlen); *(info->host + hostlen) = 0; /* null-terminated */ info->hostlen = hostlen; SPARQ_LOG("HOST=%s, hostlen=%d\n", info->host, info->hostlen); if (!(flags & HTTP_URL)) return ret; /* find the 'GET ' or 'POST ' value */ found = find_pattern2(data, datalen, "GET ", sizeof("GET ") - 1, '\r', &offset, &pathlen); if (!found) found = find_pattern2(data, datalen, "POST ", sizeof("POST ") - 1, '\r', &offset, &pathlen); SPARQ_LOG("GET/POST found=%d\n", found); if (!found || (pathlen -= (sizeof(" HTTP/x.x") - 1)) <= 0)/* ignor this field */ return ret; ret++; /* GET/POST found, increase the return value */ pathlen = ((pathlen + hostlen) < BUFSIZE) ? pathlen : BUFSIZE - hostlen; strncpy(info->url, info->host, hostlen); strncpy(info->url + hostlen, data + offset, pathlen); *(info->url + hostlen + pathlen) = 0; /* null-terminated */ info->urllen = hostlen + pathlen; SPARQ_LOG("URL=%s, urllen=%d\n", info->url, info->urllen); return ret; }