⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 5 页
字号:
	break;      case 'n': /* --basic for completeness */	config->authtype = CURLAUTH_BASIC;	break;      case 'o': /* --anyauth, let libcurl pick it */	config->authtype = CURLAUTH_ANY;	break;#ifdef __DJGPP__      case 'p': /* --wdebug */        dbug_init();        break;#endif      case 'q': /* --ftp-create-dirs */        config->ftp_create_dirs ^= TRUE;        break;      case 'r': /* --create-dirs */        config->create_dirs = TRUE;        break;      case 's': /* --max-redirs */        /* specified max no of redirects (http(s)) */        if(str2num(&config->maxredirs, nextarg))          return PARAM_BAD_NUMERIC;        break;      case 't': /* --proxy-ntlm */        config->proxyntlm ^= TRUE;        break;      case 'u': /* --crlf */        /* LF -> CRLF conversinon? */        config->crlf = TRUE;        break;      case 'v': /* --stderr */        if(strcmp(nextarg, "-")) {          config->errors = fopen(nextarg, "wt");          config->errors_fopened = TRUE;        }        else          config->errors = stdout;      break;      case 'w': /* --interface */        /* interface */        GetStr(&config->iface, nextarg);        break;      case 'x': /* --krb4 */        /* krb4 level string */        GetStr(&config->krb4level, nextarg);        break;      case 'y': /* --max-filesize */        if(str2num(&config->max_filesize, nextarg))          return PARAM_BAD_NUMERIC;        break;      case 'z': /* --disable-eprt */        config->disable_eprt ^= TRUE;        break;      default: /* the URL! */        {          struct getout *url;          if(config->url_get || (config->url_get=config->url_list)) {            /* there's a node here, if it already is filled-in continue to find               an "empty" node */            while(config->url_get && (config->url_get->flags&GETOUT_URL))              config->url_get = config->url_get->next;          }          /* now there might or might not be an available node to fill in! */          if(config->url_get)            /* existing node */            url = config->url_get;          else            /* there was no free node, create one! */            url=new_getout(config);                    if(url) {            /* fill in the URL */            GetStr(&url->url, nextarg);            url->flags |= GETOUT_URL;          }        }      }      break;    case '#': /* added 19990617 larsa */      config->progressmode ^= CURL_PROGRESS_BAR;      break;    case '0':       /* HTTP version 1.0 */      config->httpversion = CURL_HTTP_VERSION_1_0;      break;    case '1':      /* TLS version 1 */      config->ssl_version = CURL_SSLVERSION_TLSv1;      break;    case '2':       /* SSL version 2 */      config->ssl_version = CURL_SSLVERSION_SSLv2;      break;    case '3':       /* SSL version 3 */      config->ssl_version = CURL_SSLVERSION_SSLv3;      break;    case '4':       /* IPv4 */      config->ip_version = 4;      break;    case '6':       /* IPv6 */      config->ip_version = 6;      break;    case 'a':      /* This makes the FTP sessions use APPE instead of STOR */      config->conf ^= CONF_FTPAPPEND;      break;    case 'A':      /* This specifies the User-Agent name */      GetStr(&config->useragent, nextarg);      break;    case 'b': /* cookie string coming up: */      if(nextarg[0] == '@') {        nextarg++;      }      else if(strchr(nextarg, '=')) {        /* A cookie string must have a =-letter */        GetStr(&config->cookie, nextarg);        break;      }      /* We have a cookie file to read from! */      GetStr(&config->cookiefile, nextarg);      break;    case 'B':      /* use ASCII/text when transfering */      config->conf ^= CONF_GETTEXT;      break;    case 'c':      /* get the file name to dump all cookies in */      GetStr(&config->cookiejar, nextarg);      break;    case 'C':      /* This makes us continue an ftp transfer at given position */      if(!curl_strequal(nextarg, "-")) {        if(str2num(&config->resume_from, nextarg))          return PARAM_BAD_NUMERIC;        config->resume_from_current = FALSE;      }      else {        config->resume_from_current = TRUE;        config->resume_from = 0;      }      config->use_resume=TRUE;      break;    case 'd':      /* postfield data */      {        char *postdata=NULL;        if('@' == *nextarg) {          /* the data begins with a '@' letter, it means that a file name             or - (stdin) follows */          FILE *file;          nextarg++; /* pass the @ */          if(curl_strequal("-", nextarg))            file = stdin;          else             file = fopen(nextarg, "rb");          if(subletter == 'b') /* forced binary */            postdata = file2memory(file, &config->postfieldsize);          else            postdata = file2string(file);          if(file && (file != stdin))            fclose(file);        }        else {          GetStr(&postdata, nextarg);        }        if(config->postfields) {          /* we already have a string, we append this one             with a separating &-letter */          char *oldpost=config->postfields;          config->postfields=aprintf("%s&%s", oldpost, postdata);          free(oldpost);          free(postdata);        }        else          config->postfields=postdata;      }      /*        We can't set the request type here, as this data might be used in        a simple GET if -G is used. Already or soon.        if(SetHTTPrequest(HTTPREQ_SIMPLEPOST, &config->httpreq))          return PARAM_BAD_USE;      */      break;    case 'D':      /* dump-header to given file name */      GetStr(&config->headerfile, nextarg);      break;    case 'e':      {        char *ptr = strstr(nextarg, ";auto");        if(ptr) {          /* Automatic referer requested, this may be combined with a             set initial one */          config->conf |= CONF_AUTO_REFERER;          *ptr = 0; /* zero terminate here */        }        GetStr(&config->referer, nextarg);      }      break;    case 'E':      switch(subletter) {      case 'a': /* CA info PEM file */        /* CA info PEM file */        GetStr(&config->cacert, nextarg);        break;      case 'b': /* cert file type */        GetStr(&config->cert_type, nextarg);        break;      case 'c': /* private key file */        GetStr(&config->key, nextarg);        break;      case 'd': /* private key file type */        GetStr(&config->key_type, nextarg);        break;      case 'e': /* private key passphrase */        GetStr(&config->key_passwd, nextarg);        cleanarg(nextarg);        break;      case 'f': /* crypto engine */        GetStr(&config->engine, nextarg);        break;      case 'g': /* CA info PEM file */        /* CA cert directory */        GetStr(&config->capath, nextarg);        break;      default: /* certificate file */        {          char *ptr = strchr(nextarg, ':');          /* Since we live in a world of weirdness and confusion, the win32             dudes can use : when using drive letters and thus             c:\file:password needs to work. In order not to break             compatibility, we still use : as separator, but we try to detect             when it is used for a file name! On windows. */#ifdef WIN32          if(ptr &&             (ptr == &nextarg[1]) &&             (nextarg[2] == '\\') &&             (isalpha((int)nextarg[0])) )             /* colon in the second column, followed by a backslash, and the                first character is an alphabetic letter:                this is a drive letter colon */            ptr = strchr(&nextarg[3], ':'); /* find the next one instead */#endif          if(ptr) {            /* we have a password too */            *ptr=0;            ptr++;            GetStr(&config->key_passwd, ptr);          }          GetStr(&config->cert, nextarg);          cleanarg(nextarg);        }      }      break;    case 'f':      /* fail hard on errors  */      config->conf ^= CONF_FAILONERROR;      break;    case 'F':      /* "form data" simulation, this is a little advanced so lets do our best	 to sort this out slowly and carefully */      if(formparse(nextarg,                   &config->httppost,                   &config->last_post))	return PARAM_BAD_USE;      if(SetHTTPrequest(HTTPREQ_POST, &config->httpreq))        return PARAM_BAD_USE;      break;    case 'g': /* g disables URLglobbing */      config->globoff ^= TRUE;      break;    case 'G': /* HTTP GET */      config->use_httpget = TRUE;      break;    case 'h': /* h for help */      help();      return PARAM_HELP_REQUESTED;    case 'H':      /* A custom header to append to a list */      config->headers = curl_slist_append(config->headers, nextarg);      break;    case 'i':      config->conf ^= CONF_HEADER; /* include the HTTP header as well */      break;    case 'j':      config->cookiesession ^= TRUE;      break;    case 'I':      /*       * This is a bit tricky. We either SET both bits, or we clear both       * bits. Let's not make any other outcomes from this.       */      if((CONF_HEADER|CONF_NOBODY) !=         (config->conf&(CONF_HEADER|CONF_NOBODY)) ) {        /* one of them weren't set, set both */        config->conf |= (CONF_HEADER|CONF_NOBODY);        if(SetHTTPrequest(HTTPREQ_HEAD, &config->httpreq))          return PARAM_BAD_USE;      }      else {        /* both were set, clear both */        config->conf &= ~(CONF_HEADER|CONF_NOBODY);        if(SetHTTPrequest(HTTPREQ_GET, &config->httpreq))          return PARAM_BAD_USE;      }      break;    case 'k': /* allow insecure SSL connects */      config->insecure_ok ^= TRUE;      break;    case 'K': /* parse config file */      res = parseconfig(nextarg, config);      config->configread = TRUE;      if(res)	return res;      break;    case 'l':      config->conf ^= CONF_FTPLISTONLY; /* only list the names of the FTP dir */      break;    case 'L':      config->conf ^= CONF_FOLLOWLOCATION; /* Follow Location: HTTP headers */      switch (subletter) {      case 't':        /* Continue to send authentication (user+password) when following         * locations, even when hostname changed */        config->conf ^= CONF_UNRESTRICTED_AUTH;        break;      }      break;    case 'm':      /* specified max time */      if(str2num(&config->timeout, nextarg))        return PARAM_BAD_NUMERIC;      break;    case 'M': /* M for manual, huge help */      hugehelp();      return PARAM_HELP_REQUESTED;    case 'n':      switch(subletter) {      case 'o': /* CA info PEM file */        /* use .netrc or URL */        config->conf ^= CONF_NETRC_OPT;        break;      default:        /* pick info from .netrc, if this is used for http, curl will           automatically enfore user+password with the request */        config->conf ^= CONF_NETRC;        break;      }      break;    case 'N':      /* disable the output I/O buffering */      config->nobuffer ^= 1;      break;    case 'o':    case 'O':      /* output file */      {        struct getout *url;        if(config->url_out || (config->url_out=config->url_list)) {          /* there's a node here, if it already is filled-in continue to find             an "empty" node */          while(config->url_out && (config->url_out->flags&GETOUT_OUTFILE))            config->url_out = config->url_out->next;        }        /* now there might or might not be an available node to fill in! */        if(config->url_out)          /* existing node */          url = config->url_out;        else          /* there was no free node, create one! */          url=new_getout(config);        if(url) {          /* fill in the outfile */          if('o' == letter)            GetStr(&url->outfile, nextarg);          else {            url->outfile=NULL; /* leave it */            url->flags |= GETOUT_USEREMOTE;          }          url->flags |= GETOUT_OUTFILE;        }      }      break;    case 'P':      /* This makes the FTP sessions use PORT instead of PASV */      /* use <eth0> or <192.168.10.10> style addresses. Anything except	 this will make us try to get the "default" address.	 NOTE: this is a changed behaviour since the released 4.1!	 */      GetStr(&config->ftpport, nextarg);      break;    case 'p':      /* proxy tunnel for non-http protocols */      config->proxytunnel ^= TRUE;      break;    case 'q': /* if used first, already taken care of, we do it like		 this so we don't cause an error! */      break;    case 'Q':      /* QUOTE command to send to FTP server */      switch(nextarg[0]) {      case '-':        /* prefixed with a dash makes it a POST TRANSFER one */        nextarg++;        config->postquote = curl_slist_append(config->postquote, nextarg);        break;      case '+':        /* prefixed with a plus makes it a just-before-transfer one */        nextarg++;        config->prequote = curl_slist_append(config->prequote, nextarg);        break;      default:        config->quote = curl_slist_append(config->quote, nextarg);      }      break;    case 'r':      /* byte range requested */      GetStr(&config->range, nextarg);      break;    case 'R':      /* use remote file's time */      config->remote_time ^= TRUE;      break;    case 's':      /* don't show progress meter, don't show errors : */      config->conf |= (CONF_MUTE|CONF_NOPROGRESS);      config->showerror ^= TRUE; /* toggle off */      break;    case 'S':

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -