Lines Matching refs:data

52 static CURLcode rtsp_do(struct Curl_easy *data, bool *done);
53 static CURLcode rtsp_done(struct Curl_easy *data, CURLcode, bool premature);
54 static CURLcode rtsp_connect(struct Curl_easy *data, bool *done);
55 static CURLcode rtsp_disconnect(struct Curl_easy *data,
57 static int rtsp_getsock_do(struct Curl_easy *data,
62 * @param data the transfer
64 * @param buf data read from connection
65 * @param blen amount of data in buf
67 * @param readmore out, TRUE iff complete buf was consumed and more data
70 static CURLcode rtsp_rtp_write_resp(struct Curl_easy *data,
76 static CURLcode rtsp_setup_connection(struct Curl_easy *data,
78 static unsigned int rtsp_conncheck(struct Curl_easy *data,
85 static int rtsp_getsock_do(struct Curl_easy *data, struct connectdata *conn,
89 (void)data;
95 CURLcode rtp_client_write(struct Curl_easy *data, const char *ptr, size_t len);
97 CURLcode rtsp_parse_transport(struct Curl_easy *data, char *transport);
128 static CURLcode rtsp_setup_connection(struct Curl_easy *data,
134 data->req.p.rtsp = rtsp = calloc(1, sizeof(struct RTSP));
146 static unsigned int rtsp_conncheck(struct Curl_easy *data,
151 (void)data;
155 if(!Curl_conn_is_alive(data, conn, &input_pending))
163 static CURLcode rtsp_connect(struct Curl_easy *data, bool *done)
167 httpStatus = Curl_http_connect(data, done);
170 if(data->state.rtsp_next_client_CSeq == 0)
171 data->state.rtsp_next_client_CSeq = 1;
172 if(data->state.rtsp_next_server_CSeq == 0)
173 data->state.rtsp_next_server_CSeq = 1;
175 data->conn->proto.rtspc.rtp_channel = -1;
180 static CURLcode rtsp_disconnect(struct Curl_easy *data,
184 (void) data;
190 static CURLcode rtsp_done(struct Curl_easy *data,
193 struct RTSP *rtsp = data->req.p.rtsp;
197 if(data->set.rtspreq == RTSPREQ_RECEIVE)
200 httpStatus = Curl_http_done(data, status, premature);
206 if((data->set.rtspreq != RTSPREQ_RECEIVE) && (CSeq_sent != CSeq_recv)) {
207 failf(data,
212 if(data->set.rtspreq == RTSPREQ_RECEIVE &&
213 (data->conn->proto.rtspc.rtp_channel == -1)) {
214 infof(data, "Got an RTP Receive with a CSeq of %ld", CSeq_recv);
221 static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
223 struct connectdata *conn = data->conn;
225 Curl_RtspReq rtspreq = data->set.rtspreq;
226 struct RTSP *rtsp = data->req.p.rtsp;
245 rtsp->CSeq_sent = data->state.rtsp_next_client_CSeq;
251 if(!data->state.first_host) {
252 data->state.first_host = strdup(conn->host.name);
253 if(!data->state.first_host)
256 data->state.first_remote_port = conn->remote_port;
257 data->state.first_remote_protocol = conn->handler->protocol;
264 data->req.no_body = TRUE; /* most requests don't contain a body */
267 failf(data, "Got invalid RTSP request");
274 data->req.no_body = FALSE;
294 data->req.no_body = FALSE;
305 data->req.no_body = FALSE;
308 failf(data, "Got invalid RTSP request: RTSPREQ_LAST");
313 Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE, -1);
318 p_session_id = data->set.str[STRING_RTSP_SESSION_ID];
321 failf(data, "Refusing to issue an RTSP request [%s] without a session ID.",
327 if(data->set.str[STRING_RTSP_STREAM_URI]) {
328 p_stream_uri = data->set.str[STRING_RTSP_STREAM_URI];
335 p_transport = Curl_checkheaders(data, STRCONST("Transport"));
338 if(data->set.str[STRING_RTSP_TRANSPORT]) {
339 Curl_safefree(data->state.aptr.rtsp_transport);
341 data->state.aptr.rtsp_transport =
343 data->set.str[STRING_RTSP_TRANSPORT]);
344 if(!data->state.aptr.rtsp_transport)
348 failf(data,
353 p_transport = data->state.aptr.rtsp_transport;
359 p_accept = Curl_checkheaders(data, STRCONST("Accept"))?
363 if(!Curl_checkheaders(data, STRCONST("Accept-Encoding")) &&
364 data->set.str[STRING_ENCODING]) {
365 Curl_safefree(data->state.aptr.accept_encoding);
366 data->state.aptr.accept_encoding =
367 aprintf("Accept-Encoding: %s\r\n", data->set.str[STRING_ENCODING]);
369 if(!data->state.aptr.accept_encoding)
372 p_accept_encoding = data->state.aptr.accept_encoding;
380 if(Curl_checkheaders(data, STRCONST("User-Agent")) &&
381 data->state.aptr.uagent) {
382 Curl_safefree(data->state.aptr.uagent);
384 else if(!Curl_checkheaders(data, STRCONST("User-Agent")) &&
385 data->set.str[STRING_USERAGENT]) {
386 p_uagent = data->state.aptr.uagent;
390 result = Curl_http_output_auth(data, conn, p_request, HTTPREQ_GET,
395 p_proxyuserpwd = data->state.aptr.proxyuserpwd;
396 p_userpwd = data->state.aptr.userpwd;
399 Curl_safefree(data->state.aptr.ref);
400 if(data->state.referer && !Curl_checkheaders(data, STRCONST("Referer")))
401 data->state.aptr.ref = aprintf("Referer: %s\r\n", data->state.referer);
403 p_referrer = data->state.aptr.ref;
411 if(data->state.use_range &&
415 if(!Curl_checkheaders(data, STRCONST("Range")) && data->state.range) {
416 Curl_safefree(data->state.aptr.rangeline);
417 data->state.aptr.rangeline = aprintf("Range: %s\r\n", data->state.range);
418 p_range = data->state.aptr.rangeline;
425 if(Curl_checkheaders(data, STRCONST("CSeq"))) {
426 failf(data, "CSeq cannot be set as a custom header.");
429 if(Curl_checkheaders(data, STRCONST("Session"))) {
430 failf(data, "Session ID cannot be set as a custom header.");
481 Curl_safefree(data->state.aptr.userpwd);
487 result = Curl_add_timecondition(data, &req_buffer);
492 result = Curl_add_custom_headers(data, FALSE, &req_buffer);
500 if(data->state.upload) {
501 putsize = data->state.infilesize;
502 data->state.httpreq = HTTPREQ_PUT;
506 postsize = (data->state.infilesize != -1)?
507 data->state.infilesize:
508 (data->set.postfields? (curl_off_t)strlen(data->set.postfields):0);
509 data->state.httpreq = HTTPREQ_POST;
515 if(!Curl_checkheaders(data, STRCONST("Content-Length"))) {
519 (data->state.upload ? putsize : postsize));
526 if(!Curl_checkheaders(data, STRCONST("Content-Type"))) {
536 if(!Curl_checkheaders(data, STRCONST("Content-Type"))) {
545 data->state.expect100header = FALSE; /* RTSP posts are simple/small */
549 data->state.httpreq = HTTPREQ_HEAD;
550 data->req.no_body = TRUE;
555 data->req.forbidchunk = TRUE;
562 result = Curl_dyn_addn(&req_buffer, data->set.postfields,
569 result = Curl_buffer_send(&req_buffer, data, data->req.p.http,
570 &data->info.request_size, 0, FIRSTSOCKET);
572 failf(data, "Failed sending RTSP request");
576 Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE, putsize?FIRSTSOCKET:-1);
579 data->state.rtsp_next_client_CSeq++;
581 if(data->req.writebytecount) {
584 Curl_pgrsSetUploadCounter(data, data->req.writebytecount);
585 if(Curl_pgrsUpdate(data))
595 static CURLcode rtp_write_body_junk(struct Curl_easy *data,
599 struct rtsp_conn *rtspc = &(data->conn->proto.rtspc);
603 in_body = (data->req.headerline && !rtspc->in_header) &&
604 (data->req.size >= 0) &&
605 (data->req.bytecount < data->req.size);
606 body_remain = in_body? (data->req.size - data->req.bytecount) : 0;
611 return Curl_client_write(data, CLIENTWRITE_BODY, (char *)buf, blen);
616 static CURLcode rtsp_filter_rtp(struct Curl_easy *data,
621 struct rtsp_conn *rtspc = &(data->conn->proto.rtspc);
627 bool in_body = (data->req.headerline && !rtspc->in_header) &&
628 (data->req.size >= 0) &&
629 (data->req.bytecount < data->req.size);
636 data->set.rtspreq != RTSPREQ_RECEIVE) {
640 DEBUGF(infof(data, "RTP rtsp_filter_rtp[SKIP] RTSP/ prefix, "
658 result = rtp_write_body_junk(data,
680 if(!(data->state.rtp_channel_mask[idx] & (1 << off))) {
681 /* invalid channel number, junk or BODY data */
684 /* we do not consume this byte, it is BODY data */
685 DEBUGF(infof(data, "RTSP: invalid RTP channel %d, skipping", idx));
689 * to write it directly as BODY data */
690 result = rtp_write_body_junk(data, Curl_dyn_ptr(&rtspc->buf), 1);
747 DEBUGF(infof(data, "RTP write channel %d rtp_len %zu",
749 result = rtp_client_write(data, Curl_dyn_ptr(&rtspc->buf),
775 result = rtp_write_body_junk(data, (char *)(buf - skip_len), skip_len);
779 static CURLcode rtsp_rtp_write_resp(struct Curl_easy *data,
785 struct rtsp_conn *rtspc = &(data->conn->proto.rtspc);
789 if(!data->req.header)
796 DEBUGF(infof(data, "rtsp_rtp_write_resp(len=%zu, in_header=%d, eos=%d)",
801 result = rtsp_filter_rtp(data, buf, blen, &consumed);
807 if(blen && !data->req.header)
808 DEBUGF(infof(data, "RTSP: %zu bytes, possibly excess in response body",
813 if(data->req.header && blen) {
815 result = Curl_http_write_resp_hds(data, buf, blen, &consumed, done);
822 if(!data->req.header)
827 if(data->req.size <= -1) {
830 data->req.size = 0;
831 data->req.download_done = TRUE;
833 result = rtsp_filter_rtp(data, buf, blen, &consumed);
845 DEBUGF(infof(data, "rtsp_rtp_write_resp(len=%zu, in_header=%d, done=%d "
847 blen, rtspc->in_header, *done, rtspc->state, data->req.size));
849 result = Curl_client_write(data, CLIENTWRITE_BODY|
855 if((data->set.rtspreq == RTSPREQ_RECEIVE) &&
858 * data, so we stop the transfer here, if we have no incomplete
860 data->req.download_done = TRUE;
866 CURLcode rtp_client_write(struct Curl_easy *data, const char *ptr, size_t len)
873 failf(data, "Cannot write a 0 size RTP packet.");
879 data. Otherwise, use the CURLOPT_WRITEFUNCTION with the CURLOPT_WRITEDATA
880 pointer to write out the RTP data. */
881 if(data->set.fwrite_rtp) {
882 writeit = data->set.fwrite_rtp;
883 user_ptr = data->set.rtp_out;
886 writeit = data->set.fwrite_func;
887 user_ptr = data->set.out;
890 Curl_set_in_callback(data, true);
892 Curl_set_in_callback(data, false);
895 failf(data, "Cannot pause RTP");
900 failf(data, "Failed writing RTP data");
907 CURLcode Curl_rtsp_parseheader(struct Curl_easy *data, char *header)
917 struct RTSP *rtsp = data->req.p.rtsp;
919 data->state.rtsp_CSeq_recv = CSeq; /* update the handle */
922 failf(data, "Unable to read the CSeq header: [%s]", header);
937 failf(data, "Got a blank Session ID");
952 if(data->set.str[STRING_RTSP_SESSION_ID]) {
955 if(strlen(data->set.str[STRING_RTSP_SESSION_ID]) != idlen ||
956 strncmp(start, data->set.str[STRING_RTSP_SESSION_ID], idlen)) {
957 failf(data, "Got RTSP Session ID Line [%s], but wanted ID [%s]",
958 start, data->set.str[STRING_RTSP_SESSION_ID]);
968 data->set.str[STRING_RTSP_SESSION_ID] = Curl_memdup0(start, idlen);
969 if(!data->set.str[STRING_RTSP_SESSION_ID])
975 result = rtsp_parse_transport(data, header + 10);
983 CURLcode rtsp_parse_transport(struct Curl_easy *data, char *transport)
987 subsequent data validity checks.*/
1002 unsigned char *rtp_channel_mask = data->state.rtp_channel_mask;
1008 infof(data, "Unable to read the interleaved parameter from "
1020 infof(data, "Unable to read the interleaved parameter from "