• Home
  • Raw
  • Download

Lines Matching +full:- +full:- +full:disable +full:- +full:gopher

21  * SPDX-License-Identifier: curl
88 static long prevtestno = -1; /* previous test number we served */
89 static long prevpartno = -1; /* previous part number we served */
110 size_t cl; /* Content-Length of the incoming request */
113 int delay; /* if non-zero, delay this number of msec after connect */
114 int writedelay; /* if non-zero, delay this number of milliseconds between
116 int skip; /* if non-zero, the server is instructed to not read this
118 bytes said in Content-Length, but the server only reads N
119 - skip bytes. */
157 they can co-exist with the same program running as a "server" */
165 /* very-big-path support */
178 /* 'stream' means to send a never-ending stream of data */
181 /* 'connection-monitor' will output when a server/proxy connection gets
183 proper point - like with NTLM */
184 #define CMD_CONNECTIONMONITOR "connection-monitor"
193 #define CMD_NOEXPECT "no-expect"
198 DOCNUMBER_NOTHING = -4,
199 DOCNUMBER_QUIT = -3,
200 DOCNUMBER_WERULEZ = -2,
201 DOCNUMBER_404 = -1
214 "Content-Type: text/html"
216 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
252 req->testno = testnum; in parse_cmdfile()
266 stream = test2fopen(req->testno, logdir); in parse_servercmd()
267 req->close = FALSE; in parse_servercmd()
268 req->connmon = FALSE; in parse_servercmd()
273 logmsg(" Couldn't open test file %ld", req->testno); in parse_servercmd()
274 req->open = FALSE; /* closes connection */ in parse_servercmd()
288 req->open = FALSE; /* closes connection */ in parse_servercmd()
298 req->auth_req = TRUE; in parse_servercmd()
302 req->rcmd = RCMD_IDLE; in parse_servercmd()
303 req->open = TRUE; in parse_servercmd()
307 req->rcmd = RCMD_STREAM; in parse_servercmd()
312 req->connmon = TRUE; in parse_servercmd()
316 req->upgrade = TRUE; in parse_servercmd()
320 req->close = TRUE; in parse_servercmd()
324 req->skip = num; in parse_servercmd()
327 logmsg("instructed to reject Expect: 100-continue"); in parse_servercmd()
328 req->noexpect = TRUE; in parse_servercmd()
332 req->delay = num; in parse_servercmd()
336 req->writedelay = num; in parse_servercmd()
367 char *line = &req->reqbuf[req->checkindex]; in ProcessRequest()
375 req->callcount++; in ProcessRequest()
377 logmsg("Process %zu bytes request%s", req->offset, in ProcessRequest()
378 req->callcount > 1?" [CONTINUED]":""); in ProcessRequest()
384 (req->testno == DOCNUMBER_NOTHING) && in ProcessRequest()
386 logmsg("Are-we-friendly question received"); in ProcessRequest()
387 req->testno = DOCNUMBER_WERULEZ; in ProcessRequest()
391 else if(req->testno == DOCNUMBER_NOTHING) { in ProcessRequest()
406 npath = http - httppath; in ProcessRequest()
411 npath--; in ProcessRequest()
414 while(npath && ISSPACE(httppath[npath - 1])) { in ProcessRequest()
415 npath--; in ProcessRequest()
425 req->prot_version = prot_major*10 + prot_minor; in ProcessRequest()
432 ptr--; in ProcessRequest()
446 logmsg("Are-we-friendly question received"); in ProcessRequest()
447 req->testno = DOCNUMBER_WERULEZ; in ProcessRequest()
452 logmsg("Request-to-quit received"); in ProcessRequest()
453 req->testno = DOCNUMBER_QUIT; in ProcessRequest()
459 req->testno = strtol(ptr, &ptr, 10); in ProcessRequest()
461 if(req->testno > 10000) { in ProcessRequest()
462 req->partno = req->testno % 10000; in ProcessRequest()
463 req->testno /= 10000; in ProcessRequest()
466 req->partno = 0; in ProcessRequest()
468 if(req->testno) { in ProcessRequest()
471 req->testno, req->partno); in ProcessRequest()
476 req->testno = DOCNUMBER_NOTHING; in ProcessRequest()
481 if(req->testno == DOCNUMBER_NOTHING) { in ProcessRequest()
485 if(sscanf(req->reqbuf, "CONNECT %" MAXDOCNAMELEN_TXT "s HTTP/%d.%d", in ProcessRequest()
494 req->connect_request = TRUE; in ProcessRequest()
496 if(req->prot_version == 10) in ProcessRequest()
497 req->open = FALSE; /* HTTP 1.0 closes connection by default */ in ProcessRequest()
519 req->testno = part; in ProcessRequest()
529 req->connect_port = curlx_ultous(ulnum); in ProcessRequest()
533 req->connect_port, req->testno); in ProcessRequest()
537 if(req->testno == DOCNUMBER_NOTHING) in ProcessRequest()
541 if(req->testno == DOCNUMBER_NOTHING) { in ProcessRequest()
543 req->testno = DOCNUMBER_404; in ProcessRequest()
548 else if((req->offset >= 3)) { in ProcessRequest()
560 logmsg("- request found to be complete (%ld)", req->testno); in ProcessRequest()
562 if(req->testno == DOCNUMBER_NOTHING) { in ProcessRequest()
566 req->testno = strtol(&testno[9], NULL, 10); in ProcessRequest()
567 logmsg("Found test number %ld in Testno: header!", req->testno); in ProcessRequest()
578 /* when using gopher we cannot check the request until the entire in ProcessRequest()
588 /* skip all non-numericals following the slash */ in ProcessRequest()
592 req->testno = strtol(ptr, &ptr, 10); in ProcessRequest()
594 if(req->testno > 10000) { in ProcessRequest()
595 req->partno = req->testno % 10000; in ProcessRequest()
596 req->testno /= 10000; in ProcessRequest()
599 req->partno = 0; in ProcessRequest()
602 "Requested GOPHER test number %ld part %ld", in ProcessRequest()
603 req->testno, req->partno); in ProcessRequest()
623 if((req->cl == 0) && strncasecompare("Content-Length:", line, 15)) { in ProcessRequest()
624 /* If we don't ignore content-length, we read it and we read the whole in ProcessRequest()
626 ignore the content-length, we will return as soon as all headers in ProcessRequest()
637 /* this assumes that a zero Content-Length is valid */ in ProcessRequest()
638 logmsg("Found invalid Content-Length: (%s) in the request", ptr); in ProcessRequest()
639 req->open = FALSE; /* closes connection */ in ProcessRequest()
642 if(req->skipall) in ProcessRequest()
643 req->cl = 0; in ProcessRequest()
645 req->cl = clen - req->skip; in ProcessRequest()
647 logmsg("Found Content-Length: %lu in the request", clen); in ProcessRequest()
648 if(req->skip) in ProcessRequest()
649 logmsg("... but will abort after %zu bytes", req->cl); in ProcessRequest()
651 else if(strncasecompare("Transfer-Encoding: chunked", line, in ProcessRequest()
652 strlen("Transfer-Encoding: chunked"))) { in ProcessRequest()
656 else if(req->noexpect && in ProcessRequest()
657 strncasecompare("Expect: 100-continue", line, in ProcessRequest()
658 strlen("Expect: 100-continue"))) { in ProcessRequest()
659 if(req->cl) in ProcessRequest()
660 req->cl = 0; in ProcessRequest()
661 req->skipall = TRUE; in ProcessRequest()
662 logmsg("Found Expect: 100-continue, ignore body"); in ProcessRequest()
666 if(strstr(req->reqbuf, "\r\n0\r\n\r\n")) { in ProcessRequest()
670 else if(strstr(req->reqbuf, "\r\n0\r\n")) { in ProcessRequest()
671 char *last_crlf_char = strstr(req->reqbuf, "\r\n\r\n"); in ProcessRequest()
678 last_crlf_char > strstr(req->reqbuf, "\r\n0\r\n")) in ProcessRequest()
683 else if(already_recv_zeroed_chunk && strstr(req->reqbuf, "\r\n\r\n")) in ProcessRequest()
695 if(!req->auth && strstr(req->reqbuf, "Authorization:")) { in ProcessRequest()
696 req->auth = TRUE; /* Authorization: header present! */ in ProcessRequest()
697 if(req->auth_req) in ProcessRequest()
701 if(strstr(req->reqbuf, "Authorization: Negotiate")) { in ProcessRequest()
703 static long prev_testno = -1; in ProcessRequest()
704 static long prev_partno = -1; in ProcessRequest()
707 if(req->testno != prev_testno) { in ProcessRequest()
708 prev_testno = req->testno; in ProcessRequest()
709 prev_partno = req->partno; in ProcessRequest()
712 req->partno = prev_partno; in ProcessRequest()
714 else if(!req->digest && strstr(req->reqbuf, "Authorization: Digest")) { in ProcessRequest()
715 /* If the client is passing this Digest-header, we set the part number in ProcessRequest()
718 req->partno += 1000; in ProcessRequest()
719 req->digest = TRUE; /* header found */ in ProcessRequest()
720 logmsg("Received Digest request, sending back data %ld", req->partno); in ProcessRequest()
722 else if(!req->ntlm && in ProcessRequest()
723 strstr(req->reqbuf, "Authorization: NTLM TlRMTVNTUAAD")) { in ProcessRequest()
724 /* If the client is passing this type-3 NTLM header */ in ProcessRequest()
725 req->partno += 1002; in ProcessRequest()
726 req->ntlm = TRUE; /* NTLM found */ in ProcessRequest()
727 logmsg("Received NTLM type-3, sending back data %ld", req->partno); in ProcessRequest()
728 if(req->cl) { in ProcessRequest()
729 logmsg(" Expecting %zu POSTed bytes", req->cl); in ProcessRequest()
732 else if(!req->ntlm && in ProcessRequest()
733 strstr(req->reqbuf, "Authorization: NTLM TlRMTVNTUAAB")) { in ProcessRequest()
734 /* If the client is passing this type-1 NTLM header */ in ProcessRequest()
735 req->partno += 1001; in ProcessRequest()
736 req->ntlm = TRUE; /* NTLM found */ in ProcessRequest()
737 logmsg("Received NTLM type-1, sending back data %ld", req->partno); in ProcessRequest()
739 else if((req->partno >= 1000) && in ProcessRequest()
740 strstr(req->reqbuf, "Authorization: Basic")) { in ProcessRequest()
741 /* If the client is passing this Basic-header and the part number is in ProcessRequest()
744 req->partno += 1; in ProcessRequest()
745 logmsg("Received Basic request, sending back data %ld", req->partno); in ProcessRequest()
747 if(strstr(req->reqbuf, "Connection: close")) in ProcessRequest()
748 req->open = FALSE; /* close connection after this request */ in ProcessRequest()
750 if(req->open && in ProcessRequest()
751 req->prot_version >= 11 && in ProcessRequest()
752 req->reqbuf + req->offset > end + strlen(end_of_headers) && in ProcessRequest()
753 !req->cl && in ProcessRequest()
754 (!strncmp(req->reqbuf, "GET", strlen("GET")) || in ProcessRequest()
755 !strncmp(req->reqbuf, "HEAD", strlen("HEAD")))) { in ProcessRequest()
758 req->checkindex = (end - req->reqbuf) + strlen(end_of_headers); in ProcessRequest()
765 if(req->auth_req && !req->auth) { in ProcessRequest()
770 if(req->upgrade && strstr(req->reqbuf, "Upgrade:")) { in ProcessRequest()
773 req->upgrade_request = TRUE; in ProcessRequest()
777 if(req->cl > 0) { in ProcessRequest()
778 if(req->cl <= req->offset - (end - req->reqbuf) - strlen(end_of_headers)) in ProcessRequest()
817 written = fwrite(&reqbuf[totalsize-writeleft], in storerequest()
822 writeleft -= written; in storerequest()
831 totalsize-writeleft, totalsize, dumpfile); in storerequest()
846 req->checkindex = 0; in init_httprequest()
847 req->offset = 0; in init_httprequest()
848 req->testno = DOCNUMBER_NOTHING; in init_httprequest()
849 req->partno = 0; in init_httprequest()
850 req->connect_request = FALSE; in init_httprequest()
851 req->open = TRUE; in init_httprequest()
852 req->auth_req = FALSE; in init_httprequest()
853 req->auth = FALSE; in init_httprequest()
854 req->cl = 0; in init_httprequest()
855 req->digest = FALSE; in init_httprequest()
856 req->ntlm = FALSE; in init_httprequest()
857 req->skip = 0; in init_httprequest()
858 req->skipall = FALSE; in init_httprequest()
859 req->noexpect = FALSE; in init_httprequest()
860 req->delay = 0; in init_httprequest()
861 req->writedelay = 0; in init_httprequest()
862 req->rcmd = RCMD_NORMALREQ; in init_httprequest()
863 req->prot_version = 0; in init_httprequest()
864 req->callcount = 0; in init_httprequest()
865 req->connect_port = 0; in init_httprequest()
866 req->done_processing = 0; in init_httprequest()
867 req->upgrade = 0; in init_httprequest()
868 req->upgrade_request = 0; in init_httprequest()
878 char *reqbuf = req->reqbuf; in get_request()
882 if(req->upgrade_request) { in get_request()
888 reqbuf[req->offset] = '\0'; in get_request()
889 storerequest(reqbuf, req->offset); in get_request()
890 req->offset = 0; in get_request()
893 if(req->open) { in get_request()
896 got = sread(sock, reqbuf + req->offset, REQBUFSIZ - req->offset); in get_request()
898 req->offset += got; in get_request()
902 if((got == -1) && ((EAGAIN == errno) || (EWOULDBLOCK == errno))) { in get_request()
926 if(req->offset) { in get_request()
929 reqbuf[req->offset] = '\0'; in get_request()
930 storerequest(reqbuf, req->offset); in get_request()
931 req->offset = 0; in get_request()
935 return -1; in get_request()
938 if(req->offset >= REQBUFSIZ-1) { in get_request()
943 if(req->skip) in get_request()
947 got = sread(sock, reqbuf + req->offset, req->cl); in get_request()
949 got = sread(sock, reqbuf + req->offset, REQBUFSIZ-1 - req->offset); in get_request()
952 return -1; in get_request()
968 reqbuf[req->offset] = '\0'; in get_request()
969 storerequest(reqbuf, req->offset); in get_request()
970 return -1; in get_request()
975 req->offset += (size_t)got; in get_request()
976 reqbuf[req->offset] = '\0'; in get_request()
978 req->done_processing = ProcessRequest(req); in get_request()
980 return -1; in get_request()
983 if(overflow || (req->offset == REQBUFSIZ-1 && got > 0)) { in get_request()
986 reqbuf[REQBUFSIZ-1] = '\0'; in get_request()
989 else if(req->offset > REQBUFSIZ-1) { in get_request()
992 reqbuf[REQBUFSIZ-1] = '\0'; in get_request()
996 reqbuf[req->offset] = '\0'; in get_request()
999 if(fail || req->done_processing) in get_request()
1000 storerequest(reqbuf, req->offset); in get_request()
1002 return -1; in get_request()
1004 return fail ? -1 : 1; in get_request()
1007 /* returns -1 on failure */
1029 switch(req->rcmd) { in send_doc()
1039 return -1; in send_doc()
1045 return -1; in send_doc()
1051 req->open = FALSE; in send_doc()
1053 if(req->testno < 0) { in send_doc()
1057 switch(req->testno) { in send_doc()
1072 "HTTP/1.1 200 OK\r\nContent-Length: %zu\r\n\r\n%s", in send_doc()
1090 const char *section = req->connect_request?"connect":"data"; in send_doc()
1092 if(req->partno) in send_doc()
1093 msnprintf(partbuf, sizeof(partbuf), "%s%ld", section, req->partno); in send_doc()
1097 logmsg("Send response test%ld section <%s>", req->testno, partbuf); in send_doc()
1099 stream = test2fopen(req->testno, logdir); in send_doc()
1117 return -1; in send_doc()
1120 /* re-open the same file again */ in send_doc()
1121 stream = test2fopen(req->testno, logdir); in send_doc()
1143 return -1; in send_doc()
1149 if(strstr(buffer, "swsclose") || !count || req->close) { in send_doc()
1167 return -1; in send_doc()
1193 count -= written; in send_doc()
1196 if(req->writedelay) { in send_doc()
1197 int msecs_left = req->writedelay; in send_doc()
1206 intervals--; in send_doc()
1208 msecs_left -= sleep_time; in send_doc()
1223 return -1; in send_doc()
1229 responsesize-count, responsesize); in send_doc()
1230 prevtestno = req->testno; in send_doc()
1231 prevpartno = req->partno; in send_doc()
1234 return -1; in send_doc()
1252 quarters--; in send_doc()
1276 req->open = use_gopher?FALSE:persistent; in send_doc()
1278 prevtestno = req->testno; in send_doc()
1279 prevpartno = req->partno; in send_doc()
1317 /* Disable the Nagle algorithm */ in connect_to()
1424 for(loop = 2; (loop > 0) && !got_exit_signal; loop--) in http_connect()
1447 curl_socket_t maxfd = (curl_socket_t)-1; in http_connect()
1513 /* ---------------------------------------------------------- */ in http_connect()
1532 /* Disable the Nagle algorithm */ in http_connect()
1540 while(!req2->done_processing) { in http_connect()
1551 if(!err && req2->connect_request) { in http_connect()
1553 for(loop = 2; (loop > 0) && !got_exit_signal; loop--) in http_connect()
1557 serverfd[DATA] = connect_to(ipaddr, req2->connect_port); in http_connect()
1585 /* ---------------------------------------------------------- */ in http_connect()
1591 len = sizeof(readclient[i]) - tos[i]; in http_connect()
1609 len = sizeof(readserver[i])-toc[i]; in http_connect()
1640 if(toc[i] - rc) in http_connect()
1641 memmove(&readserver[i][0], &readserver[i][rc], toc[i]-rc); in http_connect()
1642 toc[i] -= rc; in http_connect()
1660 if(tos[i] - rc) in http_connect()
1661 memmove(&readclient[i][0], &readclient[i][rc], tos[i]-rc); in http_connect()
1662 tos[i] -= rc; in http_connect()
1670 /* ---------------------------------------------------------- */ in http_connect()
1674 for(loop = 2; loop > 0; loop--) { in http_connect()
1712 for(loop = 2; loop > 0; loop--) { in http_connect()
1744 /* ---------------------------------------------------------- */ in http_connect()
1764 for(i = DATA; i >= CTRL; i--) { in http_connect()
1787 logmsg("Upgraded to ... %u", req->upgrade_request); in http_upgrade()
1859 * Disable the Nagle algorithm to make it easier to send out a large in accept_connection()
1879 return -1; in service_connection()
1881 while(!req->done_processing) { in service_connection()
1891 if((req->testno == prevtestno) && in service_connection()
1892 (req->partno == prevpartno)) { in service_connection()
1893 req->partno++; in service_connection()
1894 logmsg("BOUNCE part number to %ld", req->partno); in service_connection()
1898 prevtestno = -1; in service_connection()
1899 prevpartno = -1; in service_connection()
1905 return -1; in service_connection()
1907 if(req->testno < 0) { in service_connection()
1909 return -1; in service_connection()
1911 if(!req->open) { in service_connection()
1912 logmsg("instructed to close connection after server-reply"); in service_connection()
1913 return -1; in service_connection()
1916 if(req->connect_request) { in service_connection()
1923 http_connect(&msgsock, listensock, connecthost, req->connect_port, in service_connection()
1925 return -1; in service_connection()
1929 if(req->upgrade_request) { in service_connection()
1937 if(req->open) { in service_connection()
1945 return -1; in service_connection()
1977 if(!strcmp("--version", argv[arg])) { in main()
1988 else if(!strcmp("--pidfile", argv[arg])) { in main()
1993 else if(!strcmp("--portfile", argv[arg])) { in main()
1998 else if(!strcmp("--logfile", argv[arg])) { in main()
2003 else if(!strcmp("--logdir", argv[arg])) { in main()
2008 else if(!strcmp("--cmdfile", argv[arg])) { in main()
2013 else if(!strcmp("--gopher", argv[arg])) { in main()
2016 protocol_type = "GOPHER"; in main()
2017 end_of_headers = "\r\n"; /* gopher style is much simpler */ in main()
2019 else if(!strcmp("--ipv4", argv[arg])) { in main()
2025 else if(!strcmp("--ipv6", argv[arg])) { in main()
2033 else if(!strcmp("--unix-socket", argv[arg])) { in main()
2051 else if(!strcmp("--port", argv[arg])) { in main()
2058 fprintf(stderr, "sws: invalid --port argument (%s)\n", in main()
2066 else if(!strcmp("--srcdir", argv[arg])) { in main()
2073 else if(!strcmp("--keepalive", argv[arg])) { in main()
2080 fprintf(stderr, "sws: invalid --keepalive argument (%s), must " in main()
2088 else if(!strcmp("--connect", argv[arg])) { in main()
2102 " --version\n" in main()
2103 " --logfile [file]\n" in main()
2104 " --logdir [directory]\n" in main()
2105 " --pidfile [file]\n" in main()
2106 " --portfile [file]\n" in main()
2107 " --ipv4\n" in main()
2108 " --ipv6\n" in main()
2109 " --unix-socket [file]\n" in main()
2110 " --port [port]\n" in main()
2111 " --srcdir [path]\n" in main()
2112 " --connect [ip4-addr]\n" in main()
2113 " --gopher"); in main()
2118 msnprintf(loglockfile, sizeof(loglockfile), "%s/%s/sws-%s%s-%s.lock", in main()
2120 is_proxy ? "-proxy" : "", socket_type); in main()
2281 curl_socket_t maxfd = (curl_socket_t)-1; in main()
2285 for(socket_idx = num_sockets - 1; socket_idx >= 1; --socket_idx) { in main()
2290 memmove(dst, src, end - src); in main()
2291 num_sockets -= 1; in main()
2326 /* Timed out - try again */ in main()
2341 if(req->delay) in main()
2342 wait_ms(req->delay); in main()
2344 active--; in main()
2350 active--; in main()
2362 logmsg("====> Client disconnect %d", req->connmon); in main()
2364 if(req->connmon) { in main()
2369 if(!req->open) in main()
2370 /* When instructed to close connection after server-reply we in main()
2373 a single byte of server-reply. */ in main()
2381 serverlogslocked -= 1; in main()
2385 if(req->testno == DOCNUMBER_QUIT) in main()
2390 if(rc && !req->upgrade_request) in main()
2392 * 1) req->skipall is TRUE, in main()