//prints text starting at str //prints exactly len chars void debug_txt_limit(char *str, uint8_t len) { while(len) { debug_ascii(*str); str++; len--; } }
void parse_http_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *pkt) { char *header_line, *req_value; int is_request = 0, is_response = 0; const struct ip_header *ip; const struct tcp_header *tcp; const char *data; int ip_headlen, tcp_headlen, data_len, family; ip = (struct ip_header *) (pkt + link_header_offset); switch (IP_V(ip)) { case 4: family = AF_INET; break; default: return; } ip_headlen = IP_HL(ip) * 4; if (ip_headlen < 20) return; if (ip->ip_p != IPPROTO_TCP) return; tcp = (struct tcp_header *) ((char *)ip + ip_headlen); tcp_headlen = TH_OFF(tcp) * 4; if (tcp_headlen< 20) return; data = (char *)tcp + tcp_headlen; data_len = (header->caplen - (link_header_offset + ip_headlen + tcp_headlen)); if (data_len <= 0) return; if (have_request_method(data)) { is_request = 1; } else if (strncmp(data, "HTTP/", strlen("HTTP/")) == 0) { is_response = 1; } else { return; } if (data_len > BUFSIZ) data_len = BUFSIZ; memcpy(buf, data, data_len); buf[data_len-1] = '\0'; if (is_request) { char *p = strchr(buf, '?'); if(p) *p = '\0'; debug_ascii(buf, data_len, "TEST" ); } else if (is_response) { } return; }