Lines Matching +full:- +full:- +full:disable +full:- +full:rtsp
21 * SPDX-License-Identifier: curl
27 * curl's test suite Real Time Streaming Protocol (RTSP) server.
76 static long prevtestno = -1; /* previous test number we served */
77 static long prevpartno = -1; /* previous part number we served */
107 size_t cl; /* Content-Length of the incoming request */
110 int pipe; /* if non-zero, expect this many requests to do a "piped"
112 int skip; /* if non-zero, the server is instructed to not read this
114 bytes said in Content-Length, but the server only reads N
115 - skip bytes. */
117 reqprot_t protocol; /* request protocol, HTTP or RTSP */
118 int prot_version; /* HTTP or RTSP version (major*10 + minor) */
137 #define RTSPDVERSION "curl test suite RTSP server/0.1"
142 /* very-big-path support */
155 /* 'stream' means to send a never-ending stream of data */
161 DOCNUMBER_NOTHING = -7,
162 DOCNUMBER_QUIT = -6,
163 DOCNUMBER_BADCONNECT = -5,
164 DOCNUMBER_INTERNAL = -4,
165 DOCNUMBER_CONNECT = -3,
166 DOCNUMBER_WERULEZ = -2,
167 DOCNUMBER_404 = -1
187 "Content-Type: text/html"
189 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
197 /* send back this on RTSP 404 file not found */
198 static const char *doc404_RTSP = "RTSP/1.0 404 Not Found\r\n"
208 char *line = &req->reqbuf[req->checkindex]; in ProcessRequest()
217 req->testno, line); in ProcessRequest()
221 if((req->testno == DOCNUMBER_NOTHING) && in ProcessRequest()
233 req->protocol = RPROT_HTTP; in ProcessRequest()
235 else if(!strcmp(prot_str, "RTSP")) { in ProcessRequest()
236 req->protocol = RPROT_RTSP; in ProcessRequest()
239 req->protocol = RPROT_NONE; in ProcessRequest()
244 req->prot_version = prot_major*10 + prot_minor; in ProcessRequest()
261 logmsg("Are-we-friendly question received"); in ProcessRequest()
262 req->testno = DOCNUMBER_WERULEZ; in ProcessRequest()
267 logmsg("Request-to-quit received"); in ProcessRequest()
268 req->testno = DOCNUMBER_QUIT; in ProcessRequest()
274 /* skip all non-numericals following the slash */ in ProcessRequest()
278 req->testno = strtol(ptr, &ptr, 10); in ProcessRequest()
280 if(req->testno > 10000) { in ProcessRequest()
281 req->partno = req->testno % 10000; in ProcessRequest()
282 req->testno /= 10000; in ProcessRequest()
285 req->partno = 0; in ProcessRequest()
288 req->testno, req->partno); in ProcessRequest()
291 stream = test2fopen(req->testno, logdir); in ProcessRequest()
296 logmsg("Couldn't open test file %ld", req->testno); in ProcessRequest()
297 req->open = FALSE; /* closes connection */ in ProcessRequest()
308 int rtp_partno = -1; in ProcessRequest()
316 req->open = FALSE; /* closes connection */ in ProcessRequest()
322 logmsg("Found a reply-servercmd section!"); in ProcessRequest()
327 req->auth_req = TRUE; in ProcessRequest()
331 req->rcmd = RCMD_IDLE; in ProcessRequest()
332 req->open = TRUE; in ProcessRequest()
336 req->rcmd = RCMD_STREAM; in ProcessRequest()
343 req->pipe = num-1; /* decrease by one since we don't count the in ProcessRequest()
348 req->skip = num; in ProcessRequest()
355 if(rtp_partno == req->partno) { in ProcessRequest()
378 if(!req->rtp_buffer) { in ProcessRequest()
379 req->rtp_buffer = rtp_scratch; in ProcessRequest()
380 req->rtp_buffersize = rtp_size + 4; in ProcessRequest()
383 req->rtp_buffer = realloc(req->rtp_buffer, in ProcessRequest()
384 req->rtp_buffersize + in ProcessRequest()
386 memcpy(req->rtp_buffer + req->rtp_buffersize, rtp_scratch, in ProcessRequest()
388 req->rtp_buffersize += rtp_size + 4; in ProcessRequest()
392 req->rtp_buffersize, rtp_size); in ProcessRequest()
411 if(sscanf(req->reqbuf, "CONNECT %" MAXDOCNAMELEN_TXT "s HTTP/%d.%d", in ProcessRequest()
418 if(req->prot_version == 10) in ProcessRequest()
419 req->open = FALSE; /* HTTP 1.0 closes connection by default */ in ProcessRequest()
423 req->testno = DOCNUMBER_BADCONNECT; in ProcessRequest()
429 req->testno = strtol(portp + 1, NULL, 10); in ProcessRequest()
431 req->testno = DOCNUMBER_CONNECT; in ProcessRequest()
434 req->testno = DOCNUMBER_CONNECT; in ProcessRequest()
438 req->testno = DOCNUMBER_404; in ProcessRequest()
450 if(req->pipe) in ProcessRequest()
453 req->checkindex += (end - line) + strlen(END_OF_HEADERS); in ProcessRequest()
470 if((req->cl == 0) && strncasecompare("Content-Length:", line, 15)) { in ProcessRequest()
471 /* If we don't ignore content-length, we read it and we read the whole in ProcessRequest()
473 ignore the content-length, we will return as soon as all headers in ProcessRequest()
484 /* this assumes that a zero Content-Length is valid */ in ProcessRequest()
485 logmsg("Found invalid Content-Length: (%s) in the request", ptr); in ProcessRequest()
486 req->open = FALSE; /* closes connection */ in ProcessRequest()
489 req->cl = clen - req->skip; in ProcessRequest()
491 logmsg("Found Content-Length: %lu in the request", clen); in ProcessRequest()
492 if(req->skip) in ProcessRequest()
493 logmsg("... but will abort after %zu bytes", req->cl); in ProcessRequest()
496 else if(strncasecompare("Transfer-Encoding: chunked", line, in ProcessRequest()
497 strlen("Transfer-Encoding: chunked"))) { in ProcessRequest()
503 if(strstr(req->reqbuf, "\r\n0\r\n\r\n")) in ProcessRequest()
516 if(!req->auth && strstr(req->reqbuf, "Authorization:")) { in ProcessRequest()
517 req->auth = TRUE; /* Authorization: header present! */ in ProcessRequest()
518 if(req->auth_req) in ProcessRequest()
522 if(!req->digest && strstr(req->reqbuf, "Authorization: Digest")) { in ProcessRequest()
523 /* If the client is passing this Digest-header, we set the part number in ProcessRequest()
526 req->partno += 1000; in ProcessRequest()
527 req->digest = TRUE; /* header found */ in ProcessRequest()
528 logmsg("Received Digest request, sending back data %ld", req->partno); in ProcessRequest()
530 else if(!req->ntlm && in ProcessRequest()
531 strstr(req->reqbuf, "Authorization: NTLM TlRMTVNTUAAD")) { in ProcessRequest()
532 /* If the client is passing this type-3 NTLM header */ in ProcessRequest()
533 req->partno += 1002; in ProcessRequest()
534 req->ntlm = TRUE; /* NTLM found */ in ProcessRequest()
535 logmsg("Received NTLM type-3, sending back data %ld", req->partno); in ProcessRequest()
536 if(req->cl) { in ProcessRequest()
537 logmsg(" Expecting %zu POSTed bytes", req->cl); in ProcessRequest()
540 else if(!req->ntlm && in ProcessRequest()
541 strstr(req->reqbuf, "Authorization: NTLM TlRMTVNTUAAB")) { in ProcessRequest()
542 /* If the client is passing this type-1 NTLM header */ in ProcessRequest()
543 req->partno += 1001; in ProcessRequest()
544 req->ntlm = TRUE; /* NTLM found */ in ProcessRequest()
545 logmsg("Received NTLM type-1, sending back data %ld", req->partno); in ProcessRequest()
547 else if((req->partno >= 1000) && in ProcessRequest()
548 strstr(req->reqbuf, "Authorization: Basic")) { in ProcessRequest()
549 /* If the client is passing this Basic-header and the part number is in ProcessRequest()
552 req->partno += 1; in ProcessRequest()
553 logmsg("Received Basic request, sending back data %ld", req->partno); in ProcessRequest()
555 if(strstr(req->reqbuf, "Connection: close")) in ProcessRequest()
556 req->open = FALSE; /* close connection after this request */ in ProcessRequest()
558 if(!req->pipe && in ProcessRequest()
559 req->open && in ProcessRequest()
560 req->prot_version >= 11 && in ProcessRequest()
561 req->reqbuf + req->offset > end + strlen(END_OF_HEADERS) && in ProcessRequest()
562 (!strncmp(req->reqbuf, "GET", strlen("GET")) || in ProcessRequest()
563 !strncmp(req->reqbuf, "HEAD", strlen("HEAD")))) { in ProcessRequest()
566 req->checkindex = (end - req->reqbuf) + strlen(END_OF_HEADERS); in ProcessRequest()
567 req->pipelining = TRUE; in ProcessRequest()
570 while(req->pipe) { in ProcessRequest()
574 line = &req->reqbuf[req->checkindex]; in ProcessRequest()
578 req->checkindex += (end - line) + strlen(END_OF_HEADERS); in ProcessRequest()
579 req->pipe--; in ProcessRequest()
586 if(req->auth_req && !req->auth) in ProcessRequest()
589 if(req->cl > 0) { in ProcessRequest()
590 if(req->cl <= req->offset - (end - req->reqbuf) - strlen(END_OF_HEADERS)) in ProcessRequest()
628 written = fwrite(&reqbuf[totalsize-writeleft], in storerequest()
633 writeleft -= written; in storerequest()
642 totalsize-writeleft, totalsize, dumpfile); in storerequest()
655 /* return 0 on success, non-zero on failure */
661 char *reqbuf = req->reqbuf; in get_request()
667 if(req->pipelining) { in get_request()
668 pipereq = reqbuf + req->checkindex; in get_request()
669 pipereq_length = req->offset - req->checkindex; in get_request()
674 req->checkindex = 0; in get_request()
675 req->offset = 0; in get_request()
676 req->testno = DOCNUMBER_NOTHING; in get_request()
677 req->partno = 0; in get_request()
678 req->open = TRUE; in get_request()
679 req->auth_req = FALSE; in get_request()
680 req->auth = FALSE; in get_request()
681 req->cl = 0; in get_request()
682 req->digest = FALSE; in get_request()
683 req->ntlm = FALSE; in get_request()
684 req->pipe = 0; in get_request()
685 req->skip = 0; in get_request()
686 req->rcmd = RCMD_NORMALREQ; in get_request()
687 req->protocol = RPROT_NONE; in get_request()
688 req->prot_version = 0; in get_request()
689 req->pipelining = FALSE; in get_request()
690 req->rtp_buffer = NULL; in get_request()
691 req->rtp_buffersize = 0; in get_request()
695 while(!done_processing && (req->offset < REQBUFSIZ-1)) { in get_request()
702 if(req->skip) in get_request()
706 got = sread(sock, reqbuf + req->offset, req->cl); in get_request()
708 got = sread(sock, reqbuf + req->offset, REQBUFSIZ-1 - req->offset); in get_request()
723 reqbuf[req->offset] = '\0'; in get_request()
724 storerequest(reqbuf, req->offset); in get_request()
730 req->offset += (size_t)got; in get_request()
731 reqbuf[req->offset] = '\0'; in get_request()
736 if(done_processing && req->pipe) { in get_request()
739 req->pipe--; in get_request()
743 if((req->offset == REQBUFSIZ-1) && (got > 0)) { in get_request()
746 reqbuf[REQBUFSIZ-1] = '\0'; in get_request()
749 else if(req->offset > REQBUFSIZ-1) { in get_request()
752 reqbuf[REQBUFSIZ-1] = '\0'; in get_request()
756 reqbuf[req->offset] = '\0'; in get_request()
759 storerequest(reqbuf, req->pipelining ? req->checkindex : req->offset); in get_request()
766 /* returns -1 on failure */
787 logmsg("Send response number %ld part %ld", req->testno, req->partno); in send_doc()
789 switch(req->rcmd) { in send_doc()
799 return -1; in send_doc()
805 return -1; in send_doc()
811 req->open = FALSE; in send_doc()
813 if(req->testno < 0) { in send_doc()
817 switch(req->testno) { in send_doc()
829 "HTTP/1.1 200 OK\r\nContent-Length: %zu\r\n\r\n%s", in send_doc()
835 return -1; in send_doc()
847 if(req->protocol == RPROT_HTTP) { in send_doc()
859 FILE *stream = test2fopen(req->testno, logdir); in send_doc()
861 if(0 != req->partno) in send_doc()
862 msnprintf(partbuf, sizeof(partbuf), "data%ld", req->partno); in send_doc()
881 return -1; in send_doc()
884 /* re-open the same file again */ in send_doc()
885 stream = test2fopen(req->testno, logdir); in send_doc()
908 return -1; in send_doc()
933 return -1; in send_doc()
957 count -= written; in send_doc()
962 if(req->rtp_buffer) { in send_doc()
963 logmsg("About to write %zu RTP bytes", req->rtp_buffersize); in send_doc()
964 count = req->rtp_buffersize; in send_doc()
969 written = swrite(sock, req->rtp_buffer + (req->rtp_buffersize - count), in send_doc()
975 count -= written; in send_doc()
978 free(req->rtp_buffer); in send_doc()
979 req->rtp_buffersize = 0; in send_doc()
992 return -1; in send_doc()
998 responsesize-count, responsesize); in send_doc()
1001 return -1; in send_doc()
1019 quarters--; in send_doc()
1045 req->open = persistent; in send_doc()
1047 prevtestno = req->testno; in send_doc()
1048 prevpartno = req->partno; in send_doc()
1063 const char *pidname = ".rtsp.pid"; in main()
1073 if(!strcmp("--version", argv[arg])) { in main()
1085 else if(!strcmp("--pidfile", argv[arg])) { in main()
1090 else if(!strcmp("--portfile", argv[arg])) { in main()
1095 else if(!strcmp("--logfile", argv[arg])) { in main()
1100 else if(!strcmp("--logdir", argv[arg])) { in main()
1105 else if(!strcmp("--ipv4", argv[arg])) { in main()
1112 else if(!strcmp("--ipv6", argv[arg])) { in main()
1119 else if(!strcmp("--port", argv[arg])) { in main()
1128 else if(!strcmp("--srcdir", argv[arg])) { in main()
1137 " --version\n" in main()
1138 " --logfile [file]\n" in main()
1139 " --logdir [directory]\n" in main()
1140 " --pidfile [file]\n" in main()
1141 " --portfile [file]\n" in main()
1142 " --ipv4\n" in main()
1143 " --ipv6\n" in main()
1144 " --port [port]\n" in main()
1145 " --srcdir [path]"); in main()
1150 msnprintf(loglockfile, sizeof(loglockfile), "%s/%s/rtsp-%s.lock", in main()
1303 * Disable the Nagle algorithm to make it easier to send out a large in main()
1308 (void *)&flag, sizeof(flag)) == -1) { in main()
1324 /* non-zero means error, break out of loop */ in main()
1336 prevtestno = -1; in main()
1337 prevpartno = -1; in main()
1350 logmsg("instructed to close connection after server-reply"); in main()