void parse_http_hdr(char* http_buf, int size)
{
char* tmp = http_buf;
char* url_eof;
char* url = NULL;
char* host = NULL;
char* http_ref = NULL;
char* target = NULL;
int len = 0, host_len = 0;
while (tmp - http_buf <= size - 4
&& *(_u32*)tmp != 0x0a0d0a0d) {
/* HTTP GET / HTTP/1.1*/
if (*(_u32*)tmp == 0x20544547) {
url_eof = tmp + 4;
url_eof = strstr(url_eof, "\r\n");
if (url_eof == NULL)
goto free_exit;
len = (_u8*)url_eof - (_u8*)tmp - 4 - 9 + 1;
url = (char*)malloc(len);
memcpy(url, tmp + 4, len);
url[len - 1] = 0;
}
/* HOST */
if (url && *(_u32*)tmp == 0x74736f48) {
int url_len = len - 1;
url_eof = tmp + 4;
url_eof = strstr(url_eof, "\r\n");
if (url_eof == NULL)
goto free_exit;
len = (_u8*)url_eof - (_u8*)tmp - 6 + 1;
host_len = len + url_len;
host = (char*)malloc(host_len);
memcpy(host, tmp + 6, len);
host[len - 1] = 0;
if (url_len > 2)
strcat(host, (const char *)url);
else
host_len = len;
}
tmp++;
}
http_buf[size - 1] = 0;
target = host;
/* 简单处理-过滤后缀名 */
if (target) {
len = strlen(target);
if (target[len - 1] == '/') {
target[len - 1] = 0;
len--;
}
if (strnicmp(target, "http://", 7) == 0) {
target += 7;
len -= 7;
}
if (stricmp(target + len - 4, ".mp4") == 0
|| stricmp(target + len - 4, ".flv") == 0) {
if (!last_url || stricmp(last_url, target)) {
if (last_url)
free(last_url);
last_url = (char*)malloc(len + 1);
strcpy(last_url, target);
printf("%s\n", last_url);
}
}
}
free_exit:
if (host)
free(host);
if (url)
free(url);
if (http_ref)
free(http_ref);
}
原理如下:wireshark抓包的
1、
GET /player/getFlvPath/sid/133025452760916091073_00/st/mp4/fileid/03000801004C9C1EBDFC9701BB9D9DEF57C408-3C7F-06E6-23B5-E0C0AE5F2481?K=e63f5a4af239b0e7282777ee&hd=1&myp=0&ts=146&ypremium=1 HTTP/1.1
Host: f.youku.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11