http_connect
1 准备请求头:
先组装http请求,如:"GET /otv/wxty/live/channel01/1300/20180129/20180129T152040.ts HTTP/1.1\r\nUser-Agent: Lavf/57.41.100\r\nAccept: */*\r\nConnection: close\r\nHost: gsports.livebak.ali.otvcloud.com\r\nIcy-MetaData: 1\r\n\r\n"
2 发送请求:
最终调用http的send(tcp.c的tcp_send)。
3 接收数据:
/* wait for header */
err = http_read_header(h, new_location);
此函数调用http_get_line,最终会调用tcp的read(tcp.c的tcp_read), 得到tcp回复,数据存放在HTTPContext *s = h->priv_data; s为URLContext格式。
数据内容例子如下:
HTTP/1.1 206 Partial Content\r\nServer: Tengine\r\nContent-Type: audio/x-mpegurl\r\nContent-Length: 229\r\nConnection: close\r\nDate: Mon, 29 Jan 2018 07:08:01 GMT\r\nLast-Modified: Mon, 29 Jan 2018 07:08:00 GMT\r\nETag: \"5a6ec850-e5\"\r\nAccept-Ranges: bytes\r\nVia: cache18.l2et15-2[11,200-0,M], cache31.l2et15-2[13,0], cache8.cn497[0,206-0,H], cache2.cn497[1,0]\r\nAge: 2\r\nX-Cache: HIT TCP_MEM_HIT dirn:-2:-2 mlen:-1\r\nX-Swift-SaveTime: Mon, 29 Jan 2018 07:08:02 GMT\r\nX-Swift-CacheTime: 2\r\nContent-Range: bytes 0-228/229\r\nTiming-Allow-Origin: *\r\nEagleId: b4a39f4215172096833247952e\r\n\r\n#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:3\n#EXT-X-MEDIA-SEQUENCE:5892\n#EXTINF:2.000000,\n1300/20180129/20180129T150754.ts\n#EXTINF:2.000000,\n1300/20180129/20180129T150756.ts\n#EXTINF:2.000000,\n1300/20180129/20180129T150758.ts\n"
问题:
HTTP error 404 Not Found
代码位置:
static int check_http_code(URLContext *h, int http_code, const char *end)
{
HTTPContext *s = h->priv_data;
/* error codes are 4xx and 5xx, but regard 401 as a success, so we
* don't abort until all headers have been parsed. */
if (http_code >= 400 && http_code < 600 &&
(http_code != 401 || s->auth_state.auth_type != HTTP_AUTH_NONE) &&
(http_code != 407 || s->proxy_auth_state.auth_type != HTTP_AUTH_NONE)) {
end += strspn(end, SPACE_CHARS);
av_log(h, AV_LOG_WARNING, "HTTP error %d %s\n", http_code, end);
return ff_http_averror(http_code, AVERROR(EIO));
}
return 0;
}
也就是HTTP的404错误,找不到文件。