static void satip_discovery_timerq_cb(void *aux) { satip_discovery_t *d, *next; int r; lock_assert(&global_lock); next = TAILQ_FIRST(&satip_discoveries); while (next) { d = next; next = TAILQ_NEXT(d, disc_link); if (d->http_client) { if (dispatch_clock - d->http_start > 4) satip_discovery_destroy(d, 1); continue; } d->http_client = http_client_connect(d, HTTP_VERSION_1_1, d->url.scheme, d->url.host, d->url.port, NULL); if (d->http_client == NULL) satip_discovery_destroy(d, 1); else { d->http_start = dispatch_clock; d->http_client->hc_conn_closed = satip_discovery_http_closed; http_client_register(d->http_client); r = http_client_simple(d->http_client, &d->url); if (r < 0) satip_discovery_destroy(d, 1); } } if (TAILQ_FIRST(&satip_discoveries)) gtimer_arm(&satip_discovery_timerq, satip_discovery_timerq_cb, NULL, 5); }
/* * Setup HTTP(S) connection */ static int iptv_http_start ( iptv_mux_t *im, const char *raw, const url_t *u ) { http_client_t *hc; int r; if (!(hc = http_client_connect(im, HTTP_VERSION_1_1, u->scheme, u->host, u->port, NULL))) return SM_CODE_TUNING_FAILED; hc->hc_hdr_create = iptv_http_create_header; hc->hc_hdr_received = iptv_http_header; hc->hc_data_received = iptv_http_data; hc->hc_data_complete = iptv_http_complete; hc->hc_handle_location = 1; /* allow redirects */ hc->hc_io_size = 128*1024; /* increase buffering */ http_client_register(hc); /* register to the HTTP thread */ r = http_client_simple(hc, u); if (r < 0) { http_client_close(hc); return SM_CODE_TUNING_FAILED; } im->im_data = hc; sbuf_init_fixed(&im->mm_iptv_buffer, IPTV_BUF_SIZE); return 0; }
/* * Setup RTSP(S) connection */ static int iptv_rtsp_start ( iptv_mux_t *im, const char *raw, const url_t *u ) { rtsp_priv_t *rp; http_client_t *hc; udp_connection_t *rtp, *rtcp; int r; if (!(hc = http_client_connect(im, RTSP_VERSION_1_0, u->scheme, u->host, u->port, NULL))) return SM_CODE_TUNING_FAILED; if (u->user) hc->hc_rtsp_user = strdup(u->user); if (u->pass) hc->hc_rtsp_pass = strdup(u->pass); if (udp_bind_double(&rtp, &rtcp, "IPTV", "rtp", "rtcp", NULL, 0, NULL, 128*1024, 16384, 4*1024, 4*1024) < 0) { http_client_close(hc); return SM_CODE_TUNING_FAILED; } hc->hc_hdr_received = iptv_rtsp_header; hc->hc_data_received = iptv_rtsp_data; hc->hc_handle_location = 1; /* allow redirects */ hc->hc_rtsp_keep_alive_cmd = RTSP_CMD_GET_PARAMETER; /* start keep alive loop with GET_PARAMETER */ http_client_register(hc); /* register to the HTTP thread */ r = rtsp_setup(hc, u->path, u->query, NULL, ntohs(IP_PORT(rtp->ip)), ntohs(IP_PORT(rtcp->ip))); if (r < 0) { udp_close(rtcp); udp_close(rtp); http_client_close(hc); return SM_CODE_TUNING_FAILED; } rp = calloc(1, sizeof(*rp)); rp->rtcp_info = calloc(1, sizeof(iptv_rtcp_info_t)); rtcp_init(rp->rtcp_info); rp->rtcp_info->connection = rtcp; rp->hc = hc; udp_multirecv_init(&rp->um, IPTV_PKTS, IPTV_PKT_PAYLOAD); rp->path = strdup(u->path ?: ""); rp->query = strdup(u->query ?: ""); im->im_data = rp; im->mm_iptv_fd = rtp->fd; im->mm_iptv_connection = rtp; im->mm_iptv_fd2 = rtcp->fd; im->mm_iptv_connection2 = rtcp; return 0; }
static void download_fetch(void *aux) { download_t *dn = aux; http_client_t *hc; url_t u; urlinit(&u); if (dn->url == NULL) goto done; if (strncmp(dn->url, "file://", 7) == 0) { download_file(dn, dn->url + 7); goto done; } if (strncmp(dn->url, "pipe://", 7) == 0) { download_pipe(dn, dn->url + 7); goto done; } if (dn->http_client) { http_client_close(dn->http_client); dn->http_client = NULL; } if (urlparse(dn->url, &u) < 0) { tvherror(dn->log, "wrong url"); goto stop; } hc = http_client_connect(dn, HTTP_VERSION_1_1, u.scheme, u.host, u.port, NULL); if (hc == NULL) { tvherror(dn->log, "unable to open http client"); goto stop; } hc->hc_handle_location = 1; hc->hc_data_limit = 1024*1024; hc->hc_data_complete = download_fetch_complete; http_client_register(hc); http_client_ssl_peer_verify(hc, dn->ssl_peer_verify); if (http_client_simple(hc, &u) < 0) { http_client_close(hc); tvherror(dn->log, "unable to send http command"); goto stop; } dn->http_client = hc; goto done; stop: if (dn->stop) dn->stop(dn->aux); done: urlreset(&u); }