protocol source, all about protocols and uri schemes
No binary (build failed)
—
(log yok)
| @@ -236,6 +236,7 @@ LIB_CFILES = \ | |
| pingpong.c \ | |
| pop3.c \ | |
| progress.c \ | |
| + | protocol.c \ |
| psl.c \ | |
| rand.c \ | |
| ratelimit.c \ | |
| @@ -327,6 +328,7 @@ LIB_HFILES = \ | |
| fileinfo.h \ | |
| formdata.h \ | |
| ftp.h \ | |
| + | ftp-int.h \ |
| ftplistparser.h \ | |
| functypes.h \ | |
| getinfo.h \ | |
| @@ -362,6 +364,7 @@ LIB_HFILES = \ | |
| pingpong.h \ | |
| pop3.h \ | |
| progress.h \ | |
| + | protocol.h \ |
| psl.h \ | |
| rand.h \ | |
| ratelimit.h \ | |
| @@ -25,9 +25,6 @@ | |
| ***************************************************************************/ | |
| extern const struct Curl_protocol Curl_protocol_ldap; | |
| - | extern const struct Curl_scheme Curl_scheme_ldap; |
| - | extern const struct Curl_scheme Curl_scheme_ldaps; |
| - | |
| void Curl_ldap_version(char *buf, size_t bufsz); | |
| #endif /* HEADER_CURL_LDAP_H */ | |
| @@ -225,7 +225,7 @@ void Curl_rtmp_version(char *version, size_t len) | |
| * RTMP protocol handler.h, based on https://rtmpdump.mplayerhq.hu/ | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_rtmp = { |
| + | const struct Curl_protocol Curl_protocol_rtmp = { |
| rtmp_setup_connection, /* setup_connection */ | |
| rtmp_do, /* do_it */ | |
| rtmp_done, /* done */ | |
| @@ -246,81 +246,3 @@ static const struct Curl_protocol Curl_protocol_rtmp = { | |
| }; | |
| #endif /* USE_LIBRTMP */ | |
| - | |
| - | const struct Curl_scheme Curl_scheme_rtmp = { |
| - | "rtmp", /* scheme */ |
| - | #ifndef USE_LIBRTMP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_rtmp, |
| - | #endif |
| - | CURLPROTO_RTMP, /* protocol */ |
| - | CURLPROTO_RTMP, /* family */ |
| - | PROTOPT_NONE, /* flags */ |
| - | PORT_RTMP, /* defport */ |
| - | }; |
| - | |
| - | const struct Curl_scheme Curl_scheme_rtmpt = { |
| - | "rtmpt", /* scheme */ |
| - | #ifndef USE_LIBRTMP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_rtmp, |
| - | #endif |
| - | CURLPROTO_RTMPT, /* protocol */ |
| - | CURLPROTO_RTMPT, /* family */ |
| - | PROTOPT_NONE, /* flags */ |
| - | PORT_RTMPT, /* defport */ |
| - | }; |
| - | |
| - | const struct Curl_scheme Curl_scheme_rtmpe = { |
| - | "rtmpe", /* scheme */ |
| - | #ifndef USE_LIBRTMP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_rtmp, |
| - | #endif |
| - | CURLPROTO_RTMPE, /* protocol */ |
| - | CURLPROTO_RTMPE, /* family */ |
| - | PROTOPT_NONE, /* flags */ |
| - | PORT_RTMP, /* defport */ |
| - | }; |
| - | |
| - | const struct Curl_scheme Curl_scheme_rtmpte = { |
| - | "rtmpte", /* scheme */ |
| - | #ifndef USE_LIBRTMP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_rtmp, |
| - | #endif |
| - | CURLPROTO_RTMPTE, /* protocol */ |
| - | CURLPROTO_RTMPTE, /* family */ |
| - | PROTOPT_NONE, /* flags */ |
| - | PORT_RTMPT, /* defport */ |
| - | }; |
| - | |
| - | const struct Curl_scheme Curl_scheme_rtmps = { |
| - | "rtmps", /* scheme */ |
| - | #ifndef USE_LIBRTMP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_rtmp, |
| - | #endif |
| - | CURLPROTO_RTMPS, /* protocol */ |
| - | CURLPROTO_RTMP, /* family */ |
| - | PROTOPT_NONE, /* flags */ |
| - | PORT_RTMPS, /* defport */ |
| - | }; |
| - | |
| - | const struct Curl_scheme Curl_scheme_rtmpts = { |
| - | "rtmpts", /* scheme */ |
| - | #ifndef USE_LIBRTMP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_rtmp, |
| - | #endif |
| - | CURLPROTO_RTMPTS, /* protocol */ |
| - | CURLPROTO_RTMPT, /* family */ |
| - | PROTOPT_NONE, /* flags */ |
| - | PORT_RTMPS, /* defport */ |
| - | }; |
| @@ -23,13 +23,8 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_rtmp; |
| - | extern const struct Curl_scheme Curl_scheme_rtmpt; |
| - | extern const struct Curl_scheme Curl_scheme_rtmpe; |
| - | extern const struct Curl_scheme Curl_scheme_rtmpte; |
| - | extern const struct Curl_scheme Curl_scheme_rtmps; |
| - | extern const struct Curl_scheme Curl_scheme_rtmpts; |
| #ifdef USE_LIBRTMP | |
| + | extern const struct Curl_protocol Curl_protocol_rtmp; |
| void Curl_rtmp_version(char *version, size_t len); | |
| #endif | |
| @@ -275,7 +275,7 @@ error: | |
| /* | |
| * DICT protocol | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_dict = { |
| + | const struct Curl_protocol Curl_protocol_dict = { |
| ZERO_NULL, /* setup_connection */ | |
| dict_do, /* do_it */ | |
| ZERO_NULL, /* done */ | |
| @@ -296,19 +296,3 @@ static const struct Curl_protocol Curl_protocol_dict = { | |
| }; | |
| #endif /* CURL_DISABLE_DICT */ | |
| - | |
| - | /* |
| - | * DICT protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_dict = { |
| - | "dict", /* scheme */ |
| - | #ifdef CURL_DISABLE_DICT |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_dict, |
| - | #endif |
| - | CURLPROTO_DICT, /* protocol */ |
| - | CURLPROTO_DICT, /* family */ |
| - | PROTOPT_NONE | PROTOPT_NOURLQUERY, /* flags */ |
| - | PORT_DICT, /* defport */ |
| - | }; |
| @@ -23,6 +23,8 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_dict; |
| + | #ifndef CURL_DISABLE_DICT |
| + | extern const struct Curl_protocol Curl_protocol_dict; |
| + | #endif |
| #endif /* HEADER_CURL_DICT_H */ | |
| @@ -598,7 +598,7 @@ out: | |
| return result; | |
| } | |
| - | static const struct Curl_protocol Curl_protocol_file = { |
| + | const struct Curl_protocol Curl_protocol_file = { |
| file_setup_connection, /* setup_connection */ | |
| file_do, /* do_it */ | |
| file_done, /* done */ | |
| @@ -619,19 +619,3 @@ static const struct Curl_protocol Curl_protocol_file = { | |
| }; | |
| #endif | |
| - | |
| - | /* |
| - | * FILE scheme handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_file = { |
| - | "file", /* scheme */ |
| - | #ifdef CURL_DISABLE_FILE |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_file, |
| - | #endif |
| - | CURLPROTO_FILE, /* protocol */ |
| - | CURLPROTO_FILE, /* family */ |
| - | PROTOPT_NONETWORK | PROTOPT_NOURLQUERY, /* flags */ |
| - | 0 /* defport */ |
| - | }; |
| @@ -23,6 +23,8 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_file; |
| + | #ifndef CURL_DISABLE_FILE |
| + | extern const struct Curl_protocol Curl_protocol_file; |
| + | #endif |
| #endif /* HEADER_CURL_FILE_H */ | |
| @@ -0,0 +1,160 @@ | |
| + | #ifndef HEADER_CURL_FTP_INT_H |
| + | #define HEADER_CURL_FTP_INT_H |
| + | /*************************************************************************** |
| + | * _ _ ____ _ |
| + | * Project ___| | | | _ \| | |
| + | * / __| | | | |_) | | |
| + | * | (__| |_| | _ <| |___ |
| + | * \___|\___/|_| \_\_____| |
| + | * |
| + | * Copyright (C) Daniel Stenberg, <[email protected]>, et al. |
| + | * |
| + | * This software is licensed as described in the file COPYING, which |
| + | * you should have received as part of this distribution. The terms |
| + | * are also available at https://curl.se/docs/copyright.html. |
| + | * |
| + | * You may opt to use, copy, modify, merge, publish, distribute and/or sell |
| + | * copies of the Software, and permit persons to whom the Software is |
| + | * furnished to do so, under the terms of the COPYING file. |
| + | * |
| + | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| + | * KIND, either express or implied. |
| + | * |
| + | * SPDX-License-Identifier: curl |
| + | * |
| + | ***************************************************************************/ |
| + | #include "curl_setup.h" |
| + | |
| + | #include "pingpong.h" |
| + | |
| + | #ifndef CURL_DISABLE_FTP |
| + | |
| + | /**************************************************************************** |
| + | * FTP unique setup |
| + | ***************************************************************************/ |
| + | enum { |
| + | FTP_STOP, /* do nothing state, stops the state machine */ |
| + | FTP_WAIT220, /* waiting for the initial 220 response immediately after |
| + | a connect */ |
| + | FTP_AUTH, |
| + | FTP_USER, |
| + | FTP_PASS, |
| + | FTP_ACCT, |
| + | FTP_PBSZ, |
| + | FTP_PROT, |
| + | FTP_CCC, |
| + | FTP_PWD, |
| + | FTP_SYST, |
| + | FTP_NAMEFMT, |
| + | FTP_QUOTE, /* waiting for a response to a command sent in a quote list */ |
| + | FTP_RETR_PREQUOTE, |
| + | FTP_STOR_PREQUOTE, |
| + | FTP_LIST_PREQUOTE, |
| + | FTP_POSTQUOTE, |
| + | FTP_CWD, /* change directory */ |
| + | FTP_MKD, /* if the directory did not exist */ |
| + | FTP_MDTM, /* to figure out the datestamp */ |
| + | FTP_TYPE, /* to set type when doing a head-like request */ |
| + | FTP_LIST_TYPE, /* set type when about to do a directory list */ |
| + | FTP_RETR_LIST_TYPE, |
| + | FTP_RETR_TYPE, /* set type when about to RETR a file */ |
| + | FTP_STOR_TYPE, /* set type when about to STOR a file */ |
| + | FTP_SIZE, /* get the remote file's size for head-like request */ |
| + | FTP_RETR_SIZE, /* get the remote file's size for RETR */ |
| + | FTP_STOR_SIZE, /* get the size for STOR */ |
| + | FTP_REST, /* when used to check if the server supports it in head-like */ |
| + | FTP_RETR_REST, /* when asking for "resume" in for RETR */ |
| + | FTP_PORT, /* generic state for PORT, LPRT and EPRT, check count1 */ |
| + | FTP_PRET, /* generic state for PRET RETR, PRET STOR and PRET LIST/NLST */ |
| + | FTP_PASV, /* generic state for PASV and EPSV, check count1 */ |
| + | FTP_LIST, /* generic state for LIST, NLST or a custom list command */ |
| + | FTP_RETR, |
| + | FTP_STOR, /* generic state for STOR and APPE */ |
| + | FTP_QUIT, |
| + | FTP_LAST /* never used */ |
| + | }; |
| + | typedef unsigned char ftpstate; /* use the enum values */ |
| + | |
| + | struct ftp_parselist_data; /* defined later in ftplistparser.c */ |
| + | |
| + | struct ftp_wc { |
| + | struct ftp_parselist_data *parser; |
| + | |
| + | struct { |
| + | curl_write_callback write_function; |
| + | FILE *file_descriptor; |
| + | } backup; |
| + | }; |
| + | |
| + | /* This FTP struct is used in the Curl_easy. All FTP data that is |
| + | connection-oriented must be in FTP_conn to properly deal with the fact that |
| + | perhaps the Curl_easy is changed between the times the connection is |
| + | used. */ |
| + | struct FTP { |
| + | char *path; /* points to the urlpieces struct field */ |
| + | char *pathalloc; /* if non-NULL a pointer to an allocated path */ |
| + | |
| + | /* transfer a file/body or not, done as a typedefed enum to make debuggers |
| + | display the full symbol and not the numerical value */ |
| + | curl_pp_transfer transfer; |
| + | curl_off_t downloadsize; |
| + | }; |
| + | |
| + | /* one struct entry for each path component (of 'rawpath') */ |
| + | struct pathcomp { |
| + | int start; /* start column */ |
| + | int len; /* length in bytes */ |
| + | }; |
| + | |
| + | /* ftp_conn is used for struct connection-oriented data in the connectdata |
| + | struct */ |
| + | struct ftp_conn { |
| + | struct pingpong pp; |
| + | char *account; |
| + | char *alternative_to_user; |
| + | char *entrypath; /* the PWD reply when we logged on */ |
| + | const char *file; /* url-decoded filename (or path), points into rawpath */ |
| + | char *rawpath; /* URL decoded, allocated, version of the path */ |
| + | struct pathcomp *dirs; /* allocated array for path components */ |
| + | char *prevpath; /* url-decoded conn->path from the previous transfer */ |
| + | char transfertype; /* set by ftp_transfertype for use by Curl_client_write()a |
| + | and others (A/I or zero) */ |
| + | char *server_os; /* The target server operating system. */ |
| + | curl_off_t known_filesize; /* file size is different from -1, if wildcard |
| + | LIST parsing was done and wc_statemach set |
| + | it */ |
| + | int count1; /* general purpose counter for the state machine */ |
| + | int count2; /* general purpose counter for the state machine */ |
| + | int count3; /* general purpose counter for the state machine */ |
| + | unsigned short dirdepth; /* number of entries used in the 'dirs' array, |
| + | < FTP_MAX_DIR_DEPTH */ |
| + | unsigned short cwdcount; /* number of CWD commands issued, |
| + | < FTP_MAX_DIR_DEPTH */ |
| + | unsigned char state; /* (ftpstate enum) always use ftp.c:state() to change |
| + | state! */ |
| + | unsigned char use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or |
| + | IMAP or POP3 or others! (type: curl_usessl)*/ |
| + | unsigned char ccc; /* ccc level for this connection */ |
| + | BIT(ftp_trying_alternative); |
| + | BIT(dont_check); /* Set to TRUE to prevent the final (post-transfer) |
| + | file size and 226/250 status check. It should still |
| + | read the line, ignore the result. */ |
| + | BIT(ctl_valid); /* Tells Curl_ftp_quit() whether or not to do anything. If |
| + | the connection has timed out or been closed, this |
| + | should be FALSE when it gets to Curl_ftp_quit() */ |
| + | BIT(cwddone); /* if it has been determined that the proper CWD combo |
| + | already has been done */ |
| + | BIT(cwdfail); /* set TRUE if a CWD command fails, as then we must prevent |
| + | caching the current directory */ |
| + | BIT(wait_data_conn); /* this is set TRUE if data connection is waited */ |
| + | BIT(shutdown); /* connection is being shutdown, e.g. QUIT */ |
| + | }; |
| + | |
| + | /* meta key for storing `struct FTP` as easy meta data */ |
| + | #define CURL_META_FTP_EASY "meta:proto:ftp:easy" |
| + | /* meta key for storing `struct ftp_conn` as connection meta data */ |
| + | #define CURL_META_FTP_CONN "meta:proto:ftp:conn" |
| + | |
| + | #endif /* CURL_DISABLE_FTP */ |
| + | |
| + | #endif /* HEADER_CURL_FTP_INT_H */ |
| @@ -49,6 +49,7 @@ | |
| #include "transfer.h" | |
| #include "escape.h" | |
| #include "ftp.h" | |
| + | #include "ftp-int.h" |
| #include "ftplistparser.h" | |
| #include "curl_range.h" | |
| #include "strcase.h" | |
| @@ -4456,7 +4457,7 @@ bool ftp_conns_match(struct connectdata *needle, struct connectdata *conn) | |
| /* | |
| * FTP protocol. | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_ftp = { |
| + | const struct Curl_protocol Curl_protocol_ftp = { |
| ftp_setup_connection, /* setup_connection */ | |
| ftp_do, /* do_it */ | |
| ftp_done, /* done */ | |
| @@ -4477,40 +4478,3 @@ static const struct Curl_protocol Curl_protocol_ftp = { | |
| }; | |
| #endif /* CURL_DISABLE_FTP */ | |
| - | |
| - | /* |
| - | * FTP protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_ftp = { |
| - | "ftp", /* scheme */ |
| - | #ifdef CURL_DISABLE_FTP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_ftp, |
| - | #endif |
| - | CURLPROTO_FTP, /* protocol */ |
| - | CURLPROTO_FTP, /* family */ |
| - | PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD | |
| - | PROTOPT_NOURLQUERY | PROTOPT_PROXY_AS_HTTP | |
| - | PROTOPT_WILDCARD | PROTOPT_SSL_REUSE | |
| - | PROTOPT_CONN_REUSE, /* flags */ |
| - | PORT_FTP, /* defport */ |
| - | }; |
| - | |
| - | /* |
| - | * FTPS protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_ftps = { |
| - | "ftps", /* scheme */ |
| - | #if defined(CURL_DISABLE_FTP) || !defined(USE_SSL) |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_ftp, |
| - | #endif |
| - | CURLPROTO_FTPS, /* protocol */ |
| - | CURLPROTO_FTP, /* family */ |
| - | PROTOPT_SSL | PROTOPT_DUAL | PROTOPT_CLOSEACTION | |
| - | PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY | PROTOPT_WILDCARD | |
| - | PROTOPT_CONN_REUSE, /* flags */ |
| - | PORT_FTPS, /* defport */ |
| - | }; |
| @@ -25,72 +25,10 @@ | |
| ***************************************************************************/ | |
| #include "curl_setup.h" | |
| - | #include "pingpong.h" |
| - | |
| - | extern const struct Curl_scheme Curl_scheme_ftp; |
| - | extern const struct Curl_scheme Curl_scheme_ftps; |
| - | |
| #ifndef CURL_DISABLE_FTP | |
| - | bool ftp_conns_match(struct connectdata *needle, struct connectdata *conn); |
| - | |
| - | #endif /* CURL_DISABLE_FTP */ |
| - | |
| - | /**************************************************************************** |
| - | * FTP unique setup |
| - | ***************************************************************************/ |
| - | enum { |
| - | FTP_STOP, /* do nothing state, stops the state machine */ |
| - | FTP_WAIT220, /* waiting for the initial 220 response immediately after |
| - | a connect */ |
| - | FTP_AUTH, |
| - | FTP_USER, |
| - | FTP_PASS, |
| - | FTP_ACCT, |
| - | FTP_PBSZ, |
| - | FTP_PROT, |
| - | FTP_CCC, |
| - | FTP_PWD, |
| - | FTP_SYST, |
| - | FTP_NAMEFMT, |
| - | FTP_QUOTE, /* waiting for a response to a command sent in a quote list */ |
| - | FTP_RETR_PREQUOTE, |
| - | FTP_STOR_PREQUOTE, |
| - | FTP_LIST_PREQUOTE, |
| - | FTP_POSTQUOTE, |
| - | FTP_CWD, /* change directory */ |
| - | FTP_MKD, /* if the directory did not exist */ |
| - | FTP_MDTM, /* to figure out the datestamp */ |
| - | FTP_TYPE, /* to set type when doing a head-like request */ |
| - | FTP_LIST_TYPE, /* set type when about to do a directory list */ |
| - | FTP_RETR_LIST_TYPE, |
| - | FTP_RETR_TYPE, /* set type when about to RETR a file */ |
| - | FTP_STOR_TYPE, /* set type when about to STOR a file */ |
| - | FTP_SIZE, /* get the remote file's size for head-like request */ |
| - | FTP_RETR_SIZE, /* get the remote file's size for RETR */ |
| - | FTP_STOR_SIZE, /* get the size for STOR */ |
| - | FTP_REST, /* when used to check if the server supports it in head-like */ |
| - | FTP_RETR_REST, /* when asking for "resume" in for RETR */ |
| - | FTP_PORT, /* generic state for PORT, LPRT and EPRT, check count1 */ |
| - | FTP_PRET, /* generic state for PRET RETR, PRET STOR and PRET LIST/NLST */ |
| - | FTP_PASV, /* generic state for PASV and EPSV, check count1 */ |
| - | FTP_LIST, /* generic state for LIST, NLST or a custom list command */ |
| - | FTP_RETR, |
| - | FTP_STOR, /* generic state for STOR and APPE */ |
| - | FTP_QUIT, |
| - | FTP_LAST /* never used */ |
| - | }; |
| - | typedef unsigned char ftpstate; /* use the enum values */ |
| - | |
| - | struct ftp_parselist_data; /* defined later in ftplistparser.c */ |
| + | extern const struct Curl_protocol Curl_protocol_ftp; |
| - | struct ftp_wc { |
| - | struct ftp_parselist_data *parser; |
| - | |
| - | struct { |
| - | curl_write_callback write_function; |
| - | FILE *file_descriptor; |
| - | } backup; |
| - | }; |
| + | bool ftp_conns_match(struct connectdata *needle, struct connectdata *conn); |
| typedef enum { | |
| FTPFILE_MULTICWD = 1, /* as defined by RFC1738 */ | |
| @@ -99,74 +37,7 @@ typedef enum { | |
| file */ | |
| } curl_ftpfile; | |
| - | /* This FTP struct is used in the Curl_easy. All FTP data that is |
| - | connection-oriented must be in FTP_conn to properly deal with the fact that |
| - | perhaps the Curl_easy is changed between the times the connection is |
| - | used. */ |
| - | struct FTP { |
| - | char *path; /* points to the urlpieces struct field */ |
| - | char *pathalloc; /* if non-NULL a pointer to an allocated path */ |
| - | |
| - | /* transfer a file/body or not, done as a typedefed enum to make debuggers |
| - | display the full symbol and not the numerical value */ |
| - | curl_pp_transfer transfer; |
| - | curl_off_t downloadsize; |
| - | }; |
| - | |
| - | /* one struct entry for each path component (of 'rawpath') */ |
| - | struct pathcomp { |
| - | int start; /* start column */ |
| - | int len; /* length in bytes */ |
| - | }; |
| - | |
| - | /* ftp_conn is used for struct connection-oriented data in the connectdata |
| - | struct */ |
| - | struct ftp_conn { |
| - | struct pingpong pp; |
| - | char *account; |
| - | char *alternative_to_user; |
| - | char *entrypath; /* the PWD reply when we logged on */ |
| - | const char *file; /* url-decoded filename (or path), points into rawpath */ |
| - | char *rawpath; /* URL decoded, allocated, version of the path */ |
| - | struct pathcomp *dirs; /* allocated array for path components */ |
| - | char *prevpath; /* url-decoded conn->path from the previous transfer */ |
| - | char transfertype; /* set by ftp_transfertype for use by Curl_client_write()a |
| - | and others (A/I or zero) */ |
| - | char *server_os; /* The target server operating system. */ |
| - | curl_off_t known_filesize; /* file size is different from -1, if wildcard |
| - | LIST parsing was done and wc_statemach set |
| - | it */ |
| - | int count1; /* general purpose counter for the state machine */ |
| - | int count2; /* general purpose counter for the state machine */ |
| - | int count3; /* general purpose counter for the state machine */ |
| - | unsigned short dirdepth; /* number of entries used in the 'dirs' array, |
| - | < FTP_MAX_DIR_DEPTH */ |
| - | unsigned short cwdcount; /* number of CWD commands issued, |
| - | < FTP_MAX_DIR_DEPTH */ |
| - | unsigned char state; /* (ftpstate enum) always use ftp.c:state() to change |
| - | state! */ |
| - | unsigned char use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or |
| - | IMAP or POP3 or others! (type: curl_usessl)*/ |
| - | unsigned char ccc; /* ccc level for this connection */ |
| - | BIT(ftp_trying_alternative); |
| - | BIT(dont_check); /* Set to TRUE to prevent the final (post-transfer) |
| - | file size and 226/250 status check. It should still |
| - | read the line, ignore the result. */ |
| - | BIT(ctl_valid); /* Tells Curl_ftp_quit() whether or not to do anything. If |
| - | the connection has timed out or been closed, this |
| - | should be FALSE when it gets to Curl_ftp_quit() */ |
| - | BIT(cwddone); /* if it has been determined that the proper CWD combo |
| - | already has been done */ |
| - | BIT(cwdfail); /* set TRUE if a CWD command fails, as then we must prevent |
| - | caching the current directory */ |
| - | BIT(wait_data_conn); /* this is set TRUE if data connection is waited */ |
| - | BIT(shutdown); /* connection is being shutdown, e.g. QUIT */ |
| - | }; |
| - | |
| - | /* meta key for storing `struct FTP` as easy meta data */ |
| - | #define CURL_META_FTP_EASY "meta:proto:ftp:easy" |
| - | /* meta key for storing `struct ftp_conn` as connection meta data */ |
| - | #define CURL_META_FTP_CONN "meta:proto:ftp:conn" |
| + | #endif /* CURL_DISABLE_FTP */ |
| #define DEFAULT_ACCEPT_TIMEOUT 60000 /* milliseconds == one minute */ | |
| @@ -44,6 +44,7 @@ | |
| #include "fileinfo.h" | |
| #include "llist.h" | |
| #include "ftp.h" | |
| + | #include "ftp-int.h" |
| #include "ftplistparser.h" | |
| #include "curl_fnmatch.h" | |
| #include "multiif.h" | |
| @@ -172,7 +172,7 @@ static CURLcode gopher_do(struct Curl_easy *data, bool *done) | |
| * connect-command-download protocols. | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_gopher = { |
| + | const struct Curl_protocol Curl_protocol_gopher = { |
| ZERO_NULL, /* setup_connection */ | |
| gopher_do, /* do_it */ | |
| ZERO_NULL, /* done */ | |
| @@ -193,7 +193,7 @@ static const struct Curl_protocol Curl_protocol_gopher = { | |
| }; | |
| #ifdef USE_SSL | |
| - | static const struct Curl_protocol Curl_protocol_gophers = { |
| + | const struct Curl_protocol Curl_protocol_gophers = { |
| ZERO_NULL, /* setup_connection */ | |
| gopher_do, /* do_it */ | |
| ZERO_NULL, /* done */ | |
| @@ -215,29 +215,3 @@ static const struct Curl_protocol Curl_protocol_gophers = { | |
| #endif | |
| #endif /* CURL_DISABLE_GOPHER */ | |
| - | |
| - | const struct Curl_scheme Curl_scheme_gopher = { |
| - | "gopher", /* scheme */ |
| - | #ifdef CURL_DISABLE_GOPHER |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_gopher, |
| - | #endif |
| - | CURLPROTO_GOPHER, /* protocol */ |
| - | CURLPROTO_GOPHER, /* family */ |
| - | PROTOPT_NONE, /* flags */ |
| - | PORT_GOPHER, /* defport */ |
| - | }; |
| - | |
| - | const struct Curl_scheme Curl_scheme_gophers = { |
| - | "gophers", /* scheme */ |
| - | #if defined(CURL_DISABLE_GOPHER) || !defined(USE_SSL) |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_gophers, |
| - | #endif |
| - | CURLPROTO_GOPHERS, /* protocol */ |
| - | CURLPROTO_GOPHER, /* family */ |
| - | PROTOPT_SSL, /* flags */ |
| - | PORT_GOPHER, /* defport */ |
| - | }; |
| @@ -23,7 +23,9 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_gopher; |
| - | extern const struct Curl_scheme Curl_scheme_gophers; |
| + | #ifndef CURL_DISABLE_GOPHER |
| + | extern const struct Curl_protocol Curl_protocol_gopher; |
| + | extern const struct Curl_protocol Curl_protocol_gophers; |
| + | #endif |
| #endif /* HEADER_CURL_GOPHER_H */ | |
| @@ -4996,7 +4996,7 @@ void Curl_http_resp_free(struct http_resp *resp) | |
| /* | |
| * HTTP handler interface. | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_http = { |
| + | const struct Curl_protocol Curl_protocol_http = { |
| Curl_http_setup_conn, /* setup_connection */ | |
| Curl_http, /* do_it */ | |
| Curl_http_done, /* done */ | |
| @@ -5017,37 +5017,3 @@ static const struct Curl_protocol Curl_protocol_http = { | |
| }; | |
| #endif /* CURL_DISABLE_HTTP */ | |
| - | |
| - | /* |
| - | * HTTP handler interface. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_http = { |
| - | "http", /* scheme */ |
| - | #ifdef CURL_DISABLE_HTTP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_http, |
| - | #endif |
| - | CURLPROTO_HTTP, /* protocol */ |
| - | CURLPROTO_HTTP, /* family */ |
| - | PROTOPT_CREDSPERREQUEST | /* flags */ |
| - | PROTOPT_USERPWDCTRL | PROTOPT_CONN_REUSE, |
| - | PORT_HTTP, /* defport */ |
| - | }; |
| - | |
| - | /* |
| - | * HTTPS handler interface. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_https = { |
| - | "https", /* scheme */ |
| - | #if defined(CURL_DISABLE_HTTP) || !defined(USE_SSL) |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_http, |
| - | #endif |
| - | CURLPROTO_HTTPS, /* protocol */ |
| - | CURLPROTO_HTTP, /* family */ |
| - | PROTOPT_SSL | PROTOPT_CREDSPERREQUEST | PROTOPT_ALPN | /* flags */ |
| - | PROTOPT_USERPWDCTRL | PROTOPT_CONN_REUSE, |
| - | PORT_HTTPS, /* defport */ |
| - | }; |
| @@ -37,27 +37,16 @@ typedef enum { | |
| HTTPREQ_HEAD | |
| } Curl_HttpReq; | |
| - | /* When redirecting transfers. */ |
| - | typedef enum { |
| - | FOLLOW_NONE, /* not used within the function, a placeholder to allow |
| - | initing to this */ |
| - | FOLLOW_FAKE, /* only records stuff, not actually following */ |
| - | FOLLOW_RETRY, /* set if this is a request retry as opposed to a real |
| - | redirect following */ |
| - | FOLLOW_REDIR /* a full true redirect */ |
| - | } followtype; |
| - | |
| #define CURL_HTTP_V1x (1 << 0) | |
| #define CURL_HTTP_V2x (1 << 1) | |
| #define CURL_HTTP_V3x (1 << 2) | |
| /* bitmask of CURL_HTTP_V* values */ | |
| typedef unsigned char http_majors; | |
| - | extern const struct Curl_scheme Curl_scheme_http; |
| - | extern const struct Curl_scheme Curl_scheme_https; |
| - | |
| #ifndef CURL_DISABLE_HTTP | |
| + | extern const struct Curl_protocol Curl_protocol_http; |
| + | |
| struct dynhds; | |
| struct http_negotiation { | |
| @@ -2302,7 +2302,7 @@ static CURLcode imap_setup_connection(struct Curl_easy *data, | |
| /* | |
| * IMAP protocol. | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_imap = { |
| + | const struct Curl_protocol Curl_protocol_imap = { |
| imap_setup_connection, /* setup_connection */ | |
| imap_do, /* do_it */ | |
| imap_done, /* done */ | |
| @@ -2323,38 +2323,3 @@ static const struct Curl_protocol Curl_protocol_imap = { | |
| }; | |
| #endif /* CURL_DISABLE_IMAP */ | |
| - | |
| - | /* |
| - | * IMAP protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_imap = { |
| - | "imap", /* scheme */ |
| - | #ifdef CURL_DISABLE_IMAP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_imap, |
| - | #endif |
| - | CURLPROTO_IMAP, /* protocol */ |
| - | CURLPROTO_IMAP, /* family */ |
| - | PROTOPT_CLOSEACTION | /* flags */ |
| - | PROTOPT_URLOPTIONS | PROTOPT_SSL_REUSE | |
| - | PROTOPT_CONN_REUSE, |
| - | PORT_IMAP, /* defport */ |
| - | }; |
| - | |
| - | /* |
| - | * IMAPS protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_imaps = { |
| - | "imaps", /* scheme */ |
| - | #if defined(CURL_DISABLE_IMAP) || !defined(USE_SSL) |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_imap, |
| - | #endif |
| - | CURLPROTO_IMAPS, /* protocol */ |
| - | CURLPROTO_IMAP, /* family */ |
| - | PROTOPT_CLOSEACTION | PROTOPT_SSL | /* flags */ |
| - | PROTOPT_URLOPTIONS | PROTOPT_CONN_REUSE, |
| - | PORT_IMAPS, /* defport */ |
| - | }; |
| @@ -23,8 +23,6 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_imap; |
| - | extern const struct Curl_scheme Curl_scheme_imaps; |
| /* Authentication type flags */ | |
| #define IMAP_TYPE_CLEARTEXT (1 << 0) | |
| @@ -34,4 +32,8 @@ extern const struct Curl_scheme Curl_scheme_imaps; | |
| #define IMAP_TYPE_NONE 0 | |
| #define IMAP_TYPE_ANY (IMAP_TYPE_CLEARTEXT | IMAP_TYPE_SASL) | |
| + | #ifndef CURL_DISABLE_IMAP |
| + | extern const struct Curl_protocol Curl_protocol_imap; |
| + | #endif |
| + | |
| #endif /* HEADER_CURL_IMAP_H */ | |
| @@ -1001,35 +1001,3 @@ const struct Curl_protocol Curl_protocol_ldap = { | |
| #endif | |
| #endif /* !CURL_DISABLE_LDAP && !USE_OPENLDAP */ | |
| - | |
| - | /* |
| - | * LDAP |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_ldap = { |
| - | "ldap", /* scheme */ |
| - | #ifdef CURL_DISABLE_LDAP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_ldap, |
| - | #endif |
| - | CURLPROTO_LDAP, /* protocol */ |
| - | CURLPROTO_LDAP, /* family */ |
| - | PROTOPT_SSL_REUSE, /* flags */ |
| - | PORT_LDAP, /* defport */ |
| - | }; |
| - | |
| - | /* |
| - | * LDAPS |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_ldaps = { |
| - | "ldaps", /* scheme */ |
| - | #if defined(CURL_DISABLE_LDAP) || !defined(HAVE_LDAP_SSL) |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_ldap, |
| - | #endif |
| - | CURLPROTO_LDAPS, /* protocol */ |
| - | CURLPROTO_LDAP, /* family */ |
| - | PROTOPT_SSL, /* flags */ |
| - | PORT_LDAPS, /* defport */ |
| - | }; |
| @@ -964,7 +964,7 @@ static CURLcode mqtts_connecting(struct Curl_easy *data, bool *done) | |
| /* | |
| * MQTTS protocol. | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_mqtts = { |
| + | const struct Curl_protocol Curl_protocol_mqtts = { |
| mqtt_setup_conn, /* setup_connection */ | |
| mqtt_do, /* do_it */ | |
| mqtt_done, /* done */ | |
| @@ -989,7 +989,7 @@ static const struct Curl_protocol Curl_protocol_mqtts = { | |
| /* | |
| * MQTT protocol. | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_mqtt = { |
| + | const struct Curl_protocol Curl_protocol_mqtt = { |
| mqtt_setup_conn, /* setup_connection */ | |
| mqtt_do, /* do_it */ | |
| mqtt_done, /* done */ | |
| @@ -1010,32 +1010,3 @@ static const struct Curl_protocol Curl_protocol_mqtt = { | |
| }; | |
| #endif /* CURL_DISABLE_MQTT */ | |
| - | |
| - | const struct Curl_scheme Curl_scheme_mqtts = { |
| - | "mqtts", /* scheme */ |
| - | #if defined(CURL_DISABLE_MQTT) || !defined(USE_SSL) |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_mqtts, |
| - | #endif |
| - | CURLPROTO_MQTTS, /* protocol */ |
| - | CURLPROTO_MQTT, /* family */ |
| - | PROTOPT_SSL, /* flags */ |
| - | PORT_MQTTS, /* defport */ |
| - | }; |
| - | |
| - | /* |
| - | * MQTT protocol. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_mqtt = { |
| - | "mqtt", /* scheme */ |
| - | #ifdef CURL_DISABLE_MQTT |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_mqtt, |
| - | #endif |
| - | CURLPROTO_MQTT, /* protocol */ |
| - | CURLPROTO_MQTT, /* family */ |
| - | PROTOPT_NONE, /* flags */ |
| - | PORT_MQTT, /* defport */ |
| - | }; |
| @@ -23,7 +23,11 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_mqtt; |
| - | extern const struct Curl_scheme Curl_scheme_mqtts; |
| + | #ifndef CURL_DISABLE_MQTT |
| + | extern const struct Curl_protocol Curl_protocol_mqtt; |
| + | #ifdef USE_SSL |
| + | extern const struct Curl_protocol Curl_protocol_mqtts; |
| + | #endif |
| + | #endif |
| #endif /* HEADER_CURL_MQTT_H */ | |
| @@ -1691,7 +1691,7 @@ static CURLcode pop3_setup_connection(struct Curl_easy *data, | |
| /* | |
| * POP3 protocol. | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_pop3 = { |
| + | const struct Curl_protocol Curl_protocol_pop3 = { |
| pop3_setup_connection, /* setup_connection */ | |
| pop3_do, /* do_it */ | |
| pop3_done, /* done */ | |
| @@ -1712,37 +1712,3 @@ static const struct Curl_protocol Curl_protocol_pop3 = { | |
| }; | |
| #endif /* CURL_DISABLE_POP3 */ | |
| - | |
| - | /* |
| - | * POP3 protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_pop3 = { |
| - | "pop3", /* scheme */ |
| - | #ifdef CURL_DISABLE_POP3 |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_pop3, |
| - | #endif |
| - | CURLPROTO_POP3, /* protocol */ |
| - | CURLPROTO_POP3, /* family */ |
| - | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */ |
| - | PROTOPT_URLOPTIONS | PROTOPT_SSL_REUSE | PROTOPT_CONN_REUSE, |
| - | PORT_POP3, /* defport */ |
| - | }; |
| - | |
| - | /* |
| - | * POP3S protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_pop3s = { |
| - | "pop3s", /* scheme */ |
| - | #if defined(CURL_DISABLE_POP3) || !defined(USE_SSL) |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_pop3, |
| - | #endif |
| - | CURLPROTO_POP3S, /* protocol */ |
| - | CURLPROTO_POP3, /* family */ |
| - | PROTOPT_CLOSEACTION | PROTOPT_SSL | /* flags */ |
| - | PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS | PROTOPT_CONN_REUSE, |
| - | PORT_POP3S, /* defport */ |
| - | }; |
| @@ -23,7 +23,8 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_pop3; |
| - | extern const struct Curl_scheme Curl_scheme_pop3s; |
| + | #ifndef CURL_DISABLE_POP3 |
| + | extern const struct Curl_protocol Curl_protocol_pop3; |
| + | #endif |
| #endif /* HEADER_CURL_POP3_H */ | |
| @@ -0,0 +1,571 @@ | |
| + | /*************************************************************************** |
| + | * _ _ ____ _ |
| + | * Project ___| | | | _ \| | |
| + | * / __| | | | |_) | | |
| + | * | (__| |_| | _ <| |___ |
| + | * \___|\___/|_| \_\_____| |
| + | * |
| + | * Copyright (C) Daniel Stenberg, <[email protected]>, et al. |
| + | * |
| + | * This software is licensed as described in the file COPYING, which |
| + | * you should have received as part of this distribution. The terms |
| + | * are also available at https://curl.se/docs/copyright.html. |
| + | * |
| + | * You may opt to use, copy, modify, merge, publish, distribute and/or sell |
| + | * copies of the Software, and permit persons to whom the Software is |
| + | * furnished to do so, under the terms of the COPYING file. |
| + | * |
| + | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| + | * KIND, either express or implied. |
| + | * |
| + | * SPDX-License-Identifier: curl |
| + | * |
| + | ***************************************************************************/ |
| + | #include "curl_setup.h" |
| + | |
| + | #include "protocol.h" |
| + | #include "strcase.h" |
| + | |
| + | #include "dict.h" |
| + | #include "file.h" |
| + | #include "ftp.h" |
| + | #include "gopher.h" |
| + | #include "http.h" |
| + | #include "imap.h" |
| + | #include "curl_ldap.h" |
| + | #include "mqtt.h" |
| + | #include "pop3.h" |
| + | #include "curl_rtmp.h" |
| + | #include "rtsp.h" |
| + | #include "smb.h" |
| + | #include "smtp.h" |
| + | #include "telnet.h" |
| + | #include "tftp.h" |
| + | #include "ws.h" |
| + | #include "vssh/ssh.h" |
| + | |
| + | |
| + | /* All URI schemes known to libcurl, but not necessarily implemented |
| + | * by protocol handlers. */ |
| + | const struct Curl_scheme Curl_scheme_dict = { |
| + | "dict", /* scheme */ |
| + | #ifdef CURL_DISABLE_DICT |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_dict, |
| + | #endif |
| + | CURLPROTO_DICT, /* protocol */ |
| + | CURLPROTO_DICT, /* family */ |
| + | PROTOPT_NONE | PROTOPT_NOURLQUERY, /* flags */ |
| + | PORT_DICT, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_file = { |
| + | "file", /* scheme */ |
| + | #ifdef CURL_DISABLE_FILE |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_file, |
| + | #endif |
| + | CURLPROTO_FILE, /* protocol */ |
| + | CURLPROTO_FILE, /* family */ |
| + | PROTOPT_NONETWORK | PROTOPT_NOURLQUERY, /* flags */ |
| + | 0 /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_ftp = { |
| + | "ftp", /* scheme */ |
| + | #ifdef CURL_DISABLE_FTP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_ftp, |
| + | #endif |
| + | CURLPROTO_FTP, /* protocol */ |
| + | CURLPROTO_FTP, /* family */ |
| + | PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD | |
| + | PROTOPT_NOURLQUERY | PROTOPT_PROXY_AS_HTTP | |
| + | PROTOPT_WILDCARD | PROTOPT_SSL_REUSE | |
| + | PROTOPT_CONN_REUSE, /* flags */ |
| + | PORT_FTP, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_ftps = { |
| + | "ftps", /* scheme */ |
| + | #if defined(CURL_DISABLE_FTP) || !defined(USE_SSL) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_ftp, |
| + | #endif |
| + | CURLPROTO_FTPS, /* protocol */ |
| + | CURLPROTO_FTP, /* family */ |
| + | PROTOPT_SSL | PROTOPT_DUAL | PROTOPT_CLOSEACTION | |
| + | PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY | PROTOPT_WILDCARD | |
| + | PROTOPT_CONN_REUSE, /* flags */ |
| + | PORT_FTPS, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_gopher = { |
| + | "gopher", /* scheme */ |
| + | #ifdef CURL_DISABLE_GOPHER |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_gopher, |
| + | #endif |
| + | CURLPROTO_GOPHER, /* protocol */ |
| + | CURLPROTO_GOPHER, /* family */ |
| + | PROTOPT_NONE, /* flags */ |
| + | PORT_GOPHER, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_gophers = { |
| + | "gophers", /* scheme */ |
| + | #if defined(CURL_DISABLE_GOPHER) || !defined(USE_SSL) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_gophers, |
| + | #endif |
| + | CURLPROTO_GOPHERS, /* protocol */ |
| + | CURLPROTO_GOPHER, /* family */ |
| + | PROTOPT_SSL, /* flags */ |
| + | PORT_GOPHER, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_http = { |
| + | "http", /* scheme */ |
| + | #ifdef CURL_DISABLE_HTTP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_http, |
| + | #endif |
| + | CURLPROTO_HTTP, /* protocol */ |
| + | CURLPROTO_HTTP, /* family */ |
| + | PROTOPT_CREDSPERREQUEST | /* flags */ |
| + | PROTOPT_USERPWDCTRL | PROTOPT_CONN_REUSE, |
| + | PORT_HTTP, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_https = { |
| + | "https", /* scheme */ |
| + | #if defined(CURL_DISABLE_HTTP) || !defined(USE_SSL) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_http, |
| + | #endif |
| + | CURLPROTO_HTTPS, /* protocol */ |
| + | CURLPROTO_HTTP, /* family */ |
| + | PROTOPT_SSL | PROTOPT_CREDSPERREQUEST | PROTOPT_ALPN | /* flags */ |
| + | PROTOPT_USERPWDCTRL | PROTOPT_CONN_REUSE, |
| + | PORT_HTTPS, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_imap = { |
| + | "imap", /* scheme */ |
| + | #ifdef CURL_DISABLE_IMAP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_imap, |
| + | #endif |
| + | CURLPROTO_IMAP, /* protocol */ |
| + | CURLPROTO_IMAP, /* family */ |
| + | PROTOPT_CLOSEACTION | /* flags */ |
| + | PROTOPT_URLOPTIONS | PROTOPT_SSL_REUSE | |
| + | PROTOPT_CONN_REUSE, |
| + | PORT_IMAP, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_imaps = { |
| + | "imaps", /* scheme */ |
| + | #if defined(CURL_DISABLE_IMAP) || !defined(USE_SSL) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_imap, |
| + | #endif |
| + | CURLPROTO_IMAPS, /* protocol */ |
| + | CURLPROTO_IMAP, /* family */ |
| + | PROTOPT_CLOSEACTION | PROTOPT_SSL | /* flags */ |
| + | PROTOPT_URLOPTIONS | PROTOPT_CONN_REUSE, |
| + | PORT_IMAPS, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_ldap = { |
| + | "ldap", /* scheme */ |
| + | #ifdef CURL_DISABLE_LDAP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_ldap, |
| + | #endif |
| + | CURLPROTO_LDAP, /* protocol */ |
| + | CURLPROTO_LDAP, /* family */ |
| + | PROTOPT_SSL_REUSE, /* flags */ |
| + | PORT_LDAP, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_ldaps = { |
| + | "ldaps", /* scheme */ |
| + | #if defined(CURL_DISABLE_LDAP) || !defined(HAVE_LDAP_SSL) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_ldap, |
| + | #endif |
| + | CURLPROTO_LDAPS, /* protocol */ |
| + | CURLPROTO_LDAP, /* family */ |
| + | PROTOPT_SSL, /* flags */ |
| + | PORT_LDAPS, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_mqtt = { |
| + | "mqtt", /* scheme */ |
| + | #ifdef CURL_DISABLE_MQTT |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_mqtt, |
| + | #endif |
| + | CURLPROTO_MQTT, /* protocol */ |
| + | CURLPROTO_MQTT, /* family */ |
| + | PROTOPT_NONE, /* flags */ |
| + | PORT_MQTT, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_mqtts = { |
| + | "mqtts", /* scheme */ |
| + | #if defined(CURL_DISABLE_MQTT) || !defined(USE_SSL) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_mqtts, |
| + | #endif |
| + | CURLPROTO_MQTTS, /* protocol */ |
| + | CURLPROTO_MQTT, /* family */ |
| + | PROTOPT_SSL, /* flags */ |
| + | PORT_MQTTS, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_pop3 = { |
| + | "pop3", /* scheme */ |
| + | #ifdef CURL_DISABLE_POP3 |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_pop3, |
| + | #endif |
| + | CURLPROTO_POP3, /* protocol */ |
| + | CURLPROTO_POP3, /* family */ |
| + | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */ |
| + | PROTOPT_URLOPTIONS | PROTOPT_SSL_REUSE | PROTOPT_CONN_REUSE, |
| + | PORT_POP3, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_pop3s = { |
| + | "pop3s", /* scheme */ |
| + | #if defined(CURL_DISABLE_POP3) || !defined(USE_SSL) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_pop3, |
| + | #endif |
| + | CURLPROTO_POP3S, /* protocol */ |
| + | CURLPROTO_POP3, /* family */ |
| + | PROTOPT_CLOSEACTION | PROTOPT_SSL | /* flags */ |
| + | PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS | PROTOPT_CONN_REUSE, |
| + | PORT_POP3S, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_rtmp = { |
| + | "rtmp", /* scheme */ |
| + | #ifndef USE_LIBRTMP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_rtmp, |
| + | #endif |
| + | CURLPROTO_RTMP, /* protocol */ |
| + | CURLPROTO_RTMP, /* family */ |
| + | PROTOPT_NONE, /* flags */ |
| + | PORT_RTMP, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_rtmpt = { |
| + | "rtmpt", /* scheme */ |
| + | #ifndef USE_LIBRTMP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_rtmp, |
| + | #endif |
| + | CURLPROTO_RTMPT, /* protocol */ |
| + | CURLPROTO_RTMPT, /* family */ |
| + | PROTOPT_NONE, /* flags */ |
| + | PORT_RTMPT, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_rtmpe = { |
| + | "rtmpe", /* scheme */ |
| + | #ifndef USE_LIBRTMP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_rtmp, |
| + | #endif |
| + | CURLPROTO_RTMPE, /* protocol */ |
| + | CURLPROTO_RTMPE, /* family */ |
| + | PROTOPT_NONE, /* flags */ |
| + | PORT_RTMP, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_rtmpte = { |
| + | "rtmpte", /* scheme */ |
| + | #ifndef USE_LIBRTMP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_rtmp, |
| + | #endif |
| + | CURLPROTO_RTMPTE, /* protocol */ |
| + | CURLPROTO_RTMPTE, /* family */ |
| + | PROTOPT_NONE, /* flags */ |
| + | PORT_RTMPT, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_rtmps = { |
| + | "rtmps", /* scheme */ |
| + | #ifndef USE_LIBRTMP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_rtmp, |
| + | #endif |
| + | CURLPROTO_RTMPS, /* protocol */ |
| + | CURLPROTO_RTMP, /* family */ |
| + | PROTOPT_NONE, /* flags */ |
| + | PORT_RTMPS, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_rtmpts = { |
| + | "rtmpts", /* scheme */ |
| + | #ifndef USE_LIBRTMP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_rtmp, |
| + | #endif |
| + | CURLPROTO_RTMPTS, /* protocol */ |
| + | CURLPROTO_RTMPT, /* family */ |
| + | PROTOPT_NONE, /* flags */ |
| + | PORT_RTMPS, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_rtsp = { |
| + | "rtsp", /* scheme */ |
| + | #ifdef CURL_DISABLE_RTSP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_rtsp, |
| + | #endif |
| + | CURLPROTO_RTSP, /* protocol */ |
| + | CURLPROTO_RTSP, /* family */ |
| + | PROTOPT_CONN_REUSE, /* flags */ |
| + | PORT_RTSP, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_sftp = { |
| + | "SFTP", /* scheme */ |
| + | #ifndef USE_SSH |
| + | NULL, |
| + | #else |
| + | &Curl_protocol_sftp, |
| + | #endif |
| + | CURLPROTO_SFTP, /* protocol */ |
| + | CURLPROTO_SFTP, /* family */ |
| + | PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | /* flags */ |
| + | PROTOPT_NOURLQUERY | PROTOPT_CONN_REUSE, |
| + | PORT_SSH /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_scp = { |
| + | "SCP", /* scheme */ |
| + | #ifndef USE_SSH |
| + | NULL, |
| + | #else |
| + | &Curl_protocol_scp, |
| + | #endif |
| + | CURLPROTO_SCP, /* protocol */ |
| + | CURLPROTO_SCP, /* family */ |
| + | PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | /* flags */ |
| + | PROTOPT_NOURLQUERY | PROTOPT_CONN_REUSE, |
| + | PORT_SSH, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_smb = { |
| + | "smb", /* scheme */ |
| + | #if defined(CURL_DISABLE_SMB) || !defined(USE_CURL_NTLM_CORE) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_smb, |
| + | #endif |
| + | CURLPROTO_SMB, /* protocol */ |
| + | CURLPROTO_SMB, /* family */ |
| + | PROTOPT_CONN_REUSE, /* flags */ |
| + | PORT_SMB, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_smbs = { |
| + | "smbs", /* scheme */ |
| + | #if defined(CURL_DISABLE_SMB) || !defined(USE_CURL_NTLM_CORE) || \ |
| + | !defined(USE_SSL) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_smb, |
| + | #endif |
| + | CURLPROTO_SMBS, /* protocol */ |
| + | CURLPROTO_SMB, /* family */ |
| + | PROTOPT_SSL | PROTOPT_CONN_REUSE, /* flags */ |
| + | PORT_SMBS, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_smtp = { |
| + | "smtp", /* scheme */ |
| + | #ifdef CURL_DISABLE_SMTP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_smtp, |
| + | #endif |
| + | CURLPROTO_SMTP, /* protocol */ |
| + | CURLPROTO_SMTP, /* family */ |
| + | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */ |
| + | PROTOPT_URLOPTIONS | PROTOPT_SSL_REUSE | PROTOPT_CONN_REUSE, |
| + | PORT_SMTP, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_smtps = { |
| + | "smtps", /* scheme */ |
| + | #if defined(CURL_DISABLE_SMTP) || !defined(USE_SSL) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_smtp, |
| + | #endif |
| + | CURLPROTO_SMTPS, /* protocol */ |
| + | CURLPROTO_SMTP, /* family */ |
| + | PROTOPT_CLOSEACTION | PROTOPT_SSL | /* flags */ |
| + | PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS | PROTOPT_CONN_REUSE, |
| + | PORT_SMTPS, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_telnet = { |
| + | "telnet", /* scheme */ |
| + | #ifdef CURL_DISABLE_TELNET |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_telnet, |
| + | #endif |
| + | CURLPROTO_TELNET, /* protocol */ |
| + | CURLPROTO_TELNET, /* family */ |
| + | PROTOPT_NONE | PROTOPT_NOURLQUERY, /* flags */ |
| + | PORT_TELNET, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_tftp = { |
| + | "tftp", /* scheme */ |
| + | #ifdef CURL_DISABLE_TFTP |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_tftp, |
| + | #endif |
| + | CURLPROTO_TFTP, /* protocol */ |
| + | CURLPROTO_TFTP, /* family */ |
| + | PROTOPT_NOTCPPROXY | PROTOPT_NOURLQUERY, /* flags */ |
| + | PORT_TFTP, /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_ws = { |
| + | "WS", /* scheme */ |
| + | #if defined(CURL_DISABLE_WEBSOCKETS) || defined(CURL_DISABLE_HTTP) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_ws, |
| + | #endif |
| + | CURLPROTO_WS, /* protocol */ |
| + | CURLPROTO_HTTP, /* family */ |
| + | PROTOPT_CREDSPERREQUEST | /* flags */ |
| + | PROTOPT_USERPWDCTRL, |
| + | PORT_HTTP /* defport */ |
| + | }; |
| + | |
| + | const struct Curl_scheme Curl_scheme_wss = { |
| + | "WSS", /* scheme */ |
| + | #if defined(CURL_DISABLE_WEBSOCKETS) || defined(CURL_DISABLE_HTTP) || \ |
| + | !defined(USE_SSL) |
| + | ZERO_NULL, |
| + | #else |
| + | &Curl_protocol_ws, |
| + | #endif |
| + | CURLPROTO_WSS, /* protocol */ |
| + | CURLPROTO_HTTP, /* family */ |
| + | PROTOPT_SSL | PROTOPT_CREDSPERREQUEST | /* flags */ |
| + | PROTOPT_USERPWDCTRL, |
| + | PORT_HTTPS /* defport */ |
| + | }; |
| + | |
| + | /* Returns a struct scheme pointer if the name is a known scheme. Check the |
| + | ->run struct field for non-NULL to figure out if an implementation is |
| + | present. */ |
| + | const struct Curl_scheme *Curl_getn_scheme(const char *scheme, size_t len) |
| + | { |
| + | /* table generated by schemetable.c: |
| + | 1. gcc schemetable.c && ./a.out |
| + | 2. check how small the table gets |
| + | 3. tweak the hash algorithm, then rerun from 1 |
| + | 4. when the table is good enough |
| + | 5. copy the table into this source code |
| + | 6. make sure this function uses the same hash function that worked for |
| + | schemetable.c |
| + | */ |
| + | static const struct Curl_scheme * const all_schemes[67] = { |
| + | &Curl_scheme_file, |
| + | &Curl_scheme_mqtts, NULL, |
| + | &Curl_scheme_gophers, NULL, |
| + | &Curl_scheme_rtmpe, |
| + | &Curl_scheme_smtp, |
| + | &Curl_scheme_sftp, |
| + | &Curl_scheme_smb, |
| + | &Curl_scheme_smtps, |
| + | &Curl_scheme_telnet, |
| + | &Curl_scheme_gopher, |
| + | &Curl_scheme_tftp, NULL, NULL, NULL, |
| + | &Curl_scheme_ftps, |
| + | &Curl_scheme_http, |
| + | &Curl_scheme_imap, |
| + | &Curl_scheme_rtmps, |
| + | &Curl_scheme_rtmpt, NULL, NULL, NULL, |
| + | &Curl_scheme_ldaps, |
| + | &Curl_scheme_wss, |
| + | &Curl_scheme_https, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| + | &Curl_scheme_rtsp, |
| + | &Curl_scheme_smbs, |
| + | &Curl_scheme_scp, NULL, NULL, NULL, |
| + | &Curl_scheme_pop3, NULL, NULL, |
| + | &Curl_scheme_rtmp, NULL, NULL, NULL, |
| + | &Curl_scheme_rtmpte, NULL, NULL, NULL, |
| + | &Curl_scheme_dict, NULL, NULL, NULL, |
| + | &Curl_scheme_mqtt, |
| + | &Curl_scheme_pop3s, |
| + | &Curl_scheme_imaps, NULL, |
| + | &Curl_scheme_ws, NULL, |
| + | &Curl_scheme_rtmpts, |
| + | &Curl_scheme_ldap, NULL, NULL, |
| + | &Curl_scheme_ftp, |
| + | }; |
| + | |
| + | if(len && (len <= 7)) { |
| + | const char *s = scheme; |
| + | size_t l = len; |
| + | const struct Curl_scheme *h; |
| + | unsigned int c = 978; |
| + | while(l) { |
| + | c <<= 5; |
| + | c += (unsigned int)Curl_raw_tolower(*s); |
| + | s++; |
| + | l--; |
| + | } |
| + | |
| + | h = all_schemes[c % 67]; |
| + | if(h && curl_strnequal(scheme, h->name, len) && !h->name[len]) |
| + | return h; |
| + | } |
| + | return NULL; |
| + | } |
| + | |
| + | const struct Curl_scheme *Curl_get_scheme(const char *scheme) |
| + | { |
| + | return Curl_getn_scheme(scheme, strlen(scheme)); |
| + | } |
| @@ -0,0 +1,291 @@ | |
| + | #ifndef HEADER_CURL_PROTOCOL_H |
| + | #define HEADER_CURL_PROTOCOL_H |
| + | /*************************************************************************** |
| + | * _ _ ____ _ |
| + | * Project ___| | | | _ \| | |
| + | * / __| | | | |_) | | |
| + | * | (__| |_| | _ <| |___ |
| + | * \___|\___/|_| \_\_____| |
| + | * |
| + | * Copyright (C) Daniel Stenberg, <[email protected]>, et al. |
| + | * |
| + | * This software is licensed as described in the file COPYING, which |
| + | * you should have received as part of this distribution. The terms |
| + | * are also available at https://curl.se/docs/copyright.html. |
| + | * |
| + | * You may opt to use, copy, modify, merge, publish, distribute and/or sell |
| + | * copies of the Software, and permit persons to whom the Software is |
| + | * furnished to do so, under the terms of the COPYING file. |
| + | * |
| + | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| + | * KIND, either express or implied. |
| + | * |
| + | * SPDX-License-Identifier: curl |
| + | * |
| + | ***************************************************************************/ |
| + | /* This file is for lib internal stuff */ |
| + | #include "curl_setup.h" |
| + | |
| + | struct Curl_easy; |
| + | struct connectdata; |
| + | struct easy_pollset; |
| + | |
| + | /* Known protocol default port numbers */ |
| + | #define PORT_FTP 21 |
| + | #define PORT_FTPS 990 |
| + | #define PORT_TELNET 23 |
| + | #define PORT_HTTP 80 |
| + | #define PORT_HTTPS 443 |
| + | #define PORT_DICT 2628 |
| + | #define PORT_LDAP 389 |
| + | #define PORT_LDAPS 636 |
| + | #define PORT_TFTP 69 |
| + | #define PORT_SSH 22 |
| + | #define PORT_IMAP 143 |
| + | #define PORT_IMAPS 993 |
| + | #define PORT_POP3 110 |
| + | #define PORT_POP3S 995 |
| + | #define PORT_SMB 445 |
| + | #define PORT_SMBS 445 |
| + | #define PORT_SMTP 25 |
| + | #define PORT_SMTPS 465 /* sometimes called SSMTP */ |
| + | #define PORT_RTSP 554 |
| + | #define PORT_RTMP 1935 |
| + | #define PORT_RTMPT PORT_HTTP |
| + | #define PORT_RTMPS PORT_HTTPS |
| + | #define PORT_GOPHER 70 |
| + | #define PORT_MQTT 1883 |
| + | #define PORT_MQTTS 8883 |
| + | |
| + | #ifndef CURL_DISABLE_WEBSOCKETS |
| + | /* CURLPROTO_GOPHERS (29) is the highest publicly used protocol bit number, |
| + | * the rest are internal information. If we use higher bits we only do this on |
| + | * platforms that have a >= 64-bit type and then we use such a type for the |
| + | * protocol fields in the scheme definition. |
| + | */ |
| + | #define CURLPROTO_WS (1L << 30) |
| + | #define CURLPROTO_WSS ((curl_prot_t)1 << 31) |
| + | #else |
| + | #define CURLPROTO_WS 0L |
| + | #define CURLPROTO_WSS 0L |
| + | #endif |
| + | |
| + | #define CURLPROTO_MQTTS (1LL << 32) |
| + | |
| + | #define CURLPROTO_64ALL ((uint64_t)0xffffffffffffffff) |
| + | |
| + | /* the default protocols accepting a redirect to */ |
| + | #define CURLPROTO_REDIR (CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FTP | \ |
| + | CURLPROTO_FTPS) |
| + | |
| + | typedef curl_off_t curl_prot_t; |
| + | |
| + | /* This mask is for all the old protocols that are provided and defined in the |
| + | public header and shall exclude protocols added since which are not exposed |
| + | in the API */ |
| + | #define CURLPROTO_MASK 0x3ffffff |
| + | |
| + | /* Convenience defines for checking protocols or their SSL based version. Each |
| + | protocol scheme should only ever have a single CURLPROTO_ in its protocol |
| + | field. */ |
| + | #define PROTO_FAMILY_HTTP (CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_WS | \ |
| + | CURLPROTO_WSS) |
| + | #define PROTO_FAMILY_FTP (CURLPROTO_FTP | CURLPROTO_FTPS) |
| + | #define PROTO_FAMILY_POP3 (CURLPROTO_POP3 | CURLPROTO_POP3S) |
| + | #define PROTO_FAMILY_SMB (CURLPROTO_SMB | CURLPROTO_SMBS) |
| + | #define PROTO_FAMILY_SMTP (CURLPROTO_SMTP | CURLPROTO_SMTPS) |
| + | #define PROTO_FAMILY_SSH (CURLPROTO_SCP | CURLPROTO_SFTP) |
| + | |
| + | #if !defined(CURL_DISABLE_FTP) || defined(USE_SSH) || \ |
| + | !defined(CURL_DISABLE_POP3) |
| + | /* these protocols support CURLOPT_DIRLISTONLY */ |
| + | #define CURL_LIST_ONLY_PROTOCOL 1 |
| + | #endif |
| + | |
| + | /* When redirecting transfers. */ |
| + | typedef enum { |
| + | FOLLOW_NONE, /* not used within the function, a placeholder to allow |
| + | initing to this */ |
| + | FOLLOW_FAKE, /* only records stuff, not actually following */ |
| + | FOLLOW_RETRY, /* set if this is a request retry as opposed to a real |
| + | redirect following */ |
| + | FOLLOW_REDIR /* a full true redirect */ |
| + | } followtype; |
| + | |
| + | /* |
| + | * Specific protocol handler, an implementation of one or more URI schemes. |
| + | */ |
| + | struct Curl_protocol { |
| + | /* Complement to setup_connection_internals(). This is done before the |
| + | transfer "owns" the connection. */ |
| + | CURLcode (*setup_connection)(struct Curl_easy *data, |
| + | struct connectdata *conn); |
| + | |
| + | /* These two functions MUST be set to be protocol dependent */ |
| + | CURLcode (*do_it)(struct Curl_easy *data, bool *done); |
| + | CURLcode (*done)(struct Curl_easy *, CURLcode, bool); |
| + | |
| + | /* If the curl_do() function is better made in two halves, this |
| + | * curl_do_more() function will be called afterwards, if set. For example |
| + | * for doing the FTP stuff after the PASV/PORT command. |
| + | */ |
| + | CURLcode (*do_more)(struct Curl_easy *, int *); |
| + | |
| + | /* This function *MAY* be set to a protocol-dependent function that is run |
| + | * after the connect() and everything is done, as a step in the connection. |
| + | * The 'done' pointer points to a bool that should be set to TRUE if the |
| + | * function completes before return. If it does not complete, the caller |
| + | * should call the ->connecting() function until it is. |
| + | */ |
| + | CURLcode (*connect_it)(struct Curl_easy *data, bool *done); |
| + | |
| + | /* See above. */ |
| + | CURLcode (*connecting)(struct Curl_easy *data, bool *done); |
| + | CURLcode (*doing)(struct Curl_easy *data, bool *done); |
| + | |
| + | /* Called from the multi interface during the PROTOCONNECT phase, and it |
| + | should then return a proper fd set */ |
| + | CURLcode (*proto_pollset)(struct Curl_easy *data, |
| + | struct easy_pollset *ps); |
| + | |
| + | /* Called from the multi interface during the DOING phase, and it should |
| + | then return a proper fd set */ |
| + | CURLcode (*doing_pollset)(struct Curl_easy *data, |
| + | struct easy_pollset *ps); |
| + | |
| + | /* Called from the multi interface during the DO_MORE phase, and it should |
| + | then return a proper fd set */ |
| + | CURLcode (*domore_pollset)(struct Curl_easy *data, |
| + | struct easy_pollset *ps); |
| + | |
| + | /* Called from the multi interface during the DO_DONE, PERFORM and |
| + | WAITPERFORM phases, and it should then return a proper fd set. Not setting |
| + | this will make libcurl use the generic default one. */ |
| + | CURLcode (*perform_pollset)(struct Curl_easy *data, |
| + | struct easy_pollset *ps); |
| + | |
| + | /* This function *MAY* be set to a protocol-dependent function that is run |
| + | * by the curl_disconnect(), as a step in the disconnection. If the handler |
| + | * is called because the connection has been considered dead, |
| + | * dead_connection is set to TRUE. The connection is (again) associated with |
| + | * the transfer here. |
| + | */ |
| + | CURLcode (*disconnect)(struct Curl_easy *, struct connectdata *, |
| + | bool dead_connection); |
| + | |
| + | /* If used, this function gets called from transfer.c to |
| + | allow the protocol to do extra handling in writing response to |
| + | the client. */ |
| + | CURLcode (*write_resp)(struct Curl_easy *data, const char *buf, size_t blen, |
| + | bool is_eos); |
| + | |
| + | /* If used, this function gets called from transfer.c to |
| + | allow the protocol to do extra handling in writing a single response |
| + | header line to the client. */ |
| + | CURLcode (*write_resp_hd)(struct Curl_easy *data, |
| + | const char *hd, size_t hdlen, bool is_eos); |
| + | |
| + | /* If used, this function checks for a connection managed by this |
| + | protocol and currently not in use, if it should be considered dead. */ |
| + | bool (*connection_is_dead)(struct Curl_easy *data, |
| + | struct connectdata *conn); |
| + | |
| + | /* attach() attaches this transfer to this connection */ |
| + | void (*attach)(struct Curl_easy *data, struct connectdata *conn); |
| + | |
| + | /* return CURLE_OK if a redirect to `newurl` should be followed, |
| + | CURLE_TOO_MANY_REDIRECTS otherwise. May alter `data` to change |
| + | the way the follow request is performed. */ |
| + | CURLcode (*follow)(struct Curl_easy *data, const char *newurl, |
| + | followtype type); |
| + | }; |
| + | |
| + | #define PROTOPT_NONE 0 /* nothing extra */ |
| + | #define PROTOPT_SSL (1 << 0) /* uses SSL */ |
| + | #define PROTOPT_DUAL (1 << 1) /* this protocol uses two connections */ |
| + | #define PROTOPT_CLOSEACTION (1 << 2) /* need action before socket close */ |
| + | /* some protocols will have to call the underlying functions without regard to |
| + | what exact state the socket signals. IE even if the socket says "readable", |
| + | the send function might need to be called while uploading, or vice versa. |
| + | */ |
| + | #define PROTOPT_DIRLOCK (1 << 3) |
| + | #define PROTOPT_NONETWORK (1 << 4) /* protocol does not use the network! */ |
| + | #define PROTOPT_NEEDSPWD (1 << 5) /* needs a password, and if none is set it |
| + | gets a default */ |
| + | #define PROTOPT_NOURLQUERY (1 << 6) /* protocol cannot handle |
| + | URL query strings (?foo=bar) ! */ |
| + | #define PROTOPT_CREDSPERREQUEST (1 << 7) /* requires login credentials per |
| + | request instead of per |
| + | connection */ |
| + | #define PROTOPT_ALPN (1 << 8) /* set ALPN for this */ |
| + | /* (1 << 9) was PROTOPT_STREAM, now free */ |
| + | #define PROTOPT_URLOPTIONS (1 << 10) /* allow options part in the userinfo |
| + | field of the URL */ |
| + | #define PROTOPT_PROXY_AS_HTTP (1 << 11) /* allow this non-HTTP scheme over a |
| + | HTTP proxy as HTTP proxies may know |
| + | this protocol and act as |
| + | a gateway */ |
| + | #define PROTOPT_WILDCARD (1 << 12) /* protocol supports wildcard matching */ |
| + | #define PROTOPT_USERPWDCTRL (1 << 13) /* Allow "control bytes" (< 32 ASCII) in |
| + | username and password */ |
| + | #define PROTOPT_NOTCPPROXY (1 << 14) /* this protocol cannot proxy over TCP */ |
| + | #define PROTOPT_SSL_REUSE (1 << 15) /* this protocol may reuse an existing |
| + | SSL connection in the same family |
| + | without having PROTOPT_SSL. */ |
| + | #define PROTOPT_CONN_REUSE (1 << 16) /* this protocol can reuse connections */ |
| + | |
| + | /* Everything about a URI scheme. */ |
| + | struct Curl_scheme { |
| + | const char *name; /* URL scheme name in lowercase */ |
| + | const struct Curl_protocol *run; /* implementation, optional */ |
| + | curl_prot_t protocol; /* See CURLPROTO_* - this needs to be the single |
| + | specific protocol bit */ |
| + | curl_prot_t family; /* single bit for protocol family; the non-TLS name |
| + | of the protocol this is */ |
| + | uint32_t flags; /* Extra particular characteristics, see PROTOPT_* */ |
| + | uint16_t defport; /* Default port. */ |
| + | }; |
| + | |
| + | /* Get scheme definition for a URI scheme name |
| + | * @param scheme URI scheme name, case-insensitive |
| + | * @return NULL if scheme is not known |
| + | */ |
| + | const struct Curl_scheme *Curl_get_scheme(const char *scheme); |
| + | const struct Curl_scheme *Curl_getn_scheme(const char *scheme, size_t len); |
| + | |
| + | /* For direct access to a URI scheme */ |
| + | extern const struct Curl_scheme Curl_scheme_dict; |
| + | extern const struct Curl_scheme Curl_scheme_file; |
| + | extern const struct Curl_scheme Curl_scheme_ftp; |
| + | extern const struct Curl_scheme Curl_scheme_ftps; |
| + | extern const struct Curl_scheme Curl_scheme_gopher; |
| + | extern const struct Curl_scheme Curl_scheme_gophers; |
| + | extern const struct Curl_scheme Curl_scheme_http; |
| + | extern const struct Curl_scheme Curl_scheme_https; |
| + | extern const struct Curl_scheme Curl_scheme_imap; |
| + | extern const struct Curl_scheme Curl_scheme_imaps; |
| + | extern const struct Curl_scheme Curl_scheme_ldap; |
| + | extern const struct Curl_scheme Curl_scheme_ldaps; |
| + | extern const struct Curl_scheme Curl_scheme_mqtt; |
| + | extern const struct Curl_scheme Curl_scheme_mqtts; |
| + | extern const struct Curl_scheme Curl_scheme_pop3; |
| + | extern const struct Curl_scheme Curl_scheme_pop3s; |
| + | extern const struct Curl_scheme Curl_scheme_rtmp; |
| + | extern const struct Curl_scheme Curl_scheme_rtmpe; |
| + | extern const struct Curl_scheme Curl_scheme_rtmpt; |
| + | extern const struct Curl_scheme Curl_scheme_rtmpte; |
| + | extern const struct Curl_scheme Curl_scheme_rtmps; |
| + | extern const struct Curl_scheme Curl_scheme_rtmpts; |
| + | extern const struct Curl_scheme Curl_scheme_rtsp; |
| + | extern const struct Curl_scheme Curl_scheme_scp; |
| + | extern const struct Curl_scheme Curl_scheme_sftp; |
| + | extern const struct Curl_scheme Curl_scheme_smb; |
| + | extern const struct Curl_scheme Curl_scheme_smbs; |
| + | extern const struct Curl_scheme Curl_scheme_smtp; |
| + | extern const struct Curl_scheme Curl_scheme_smtps; |
| + | extern const struct Curl_scheme Curl_scheme_telnet; |
| + | extern const struct Curl_scheme Curl_scheme_tftp; |
| + | extern const struct Curl_scheme Curl_scheme_ws; |
| + | extern const struct Curl_scheme Curl_scheme_wss; |
| + | |
| + | #endif /* HEADER_CURL_PROTOCOL_H */ |
| @@ -1051,7 +1051,7 @@ CURLcode Curl_rtsp_parseheader(struct Curl_easy *data, const char *header) | |
| /* | |
| * RTSP handler interface. | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_rtsp = { |
| + | const struct Curl_protocol Curl_protocol_rtsp = { |
| rtsp_setup_connection, /* setup_connection */ | |
| rtsp_do, /* do_it */ | |
| rtsp_done, /* done */ | |
| @@ -1072,19 +1072,3 @@ static const struct Curl_protocol Curl_protocol_rtsp = { | |
| }; | |
| #endif /* CURL_DISABLE_RTSP */ | |
| - | |
| - | /* |
| - | * RTSP handler interface. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_rtsp = { |
| - | "rtsp", /* scheme */ |
| - | #ifdef CURL_DISABLE_RTSP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_rtsp, |
| - | #endif |
| - | CURLPROTO_RTSP, /* protocol */ |
| - | CURLPROTO_RTSP, /* family */ |
| - | PROTOPT_CONN_REUSE, /* flags */ |
| - | PORT_RTSP, /* defport */ |
| - | }; |
| @@ -23,9 +23,9 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_rtsp; |
| #ifndef CURL_DISABLE_RTSP | |
| CURLcode Curl_rtsp_parseheader(struct Curl_easy *data, const char *header); | |
| + | extern const struct Curl_protocol Curl_protocol_rtsp; |
| #else | |
| #define Curl_rtsp_parseheader(x, y) CURLE_NOT_BUILT_IN | |
| #endif | |
| @@ -1208,7 +1208,7 @@ static CURLcode smb_do(struct Curl_easy *data, bool *done) | |
| /* | |
| * SMB handler interface | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_smb = { |
| + | const struct Curl_protocol Curl_protocol_smb = { |
| smb_setup_connection, /* setup_connection */ | |
| smb_do, /* do_it */ | |
| ZERO_NULL, /* done */ | |
| @@ -1229,36 +1229,3 @@ static const struct Curl_protocol Curl_protocol_smb = { | |
| }; | |
| #endif /* CURL_DISABLE_SMB && USE_CURL_NTLM_CORE && SIZEOF_CURL_OFF_T > 4 */ | |
| - | |
| - | /* |
| - | * SMB handler interface |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_smb = { |
| - | "smb", /* scheme */ |
| - | #if defined(CURL_DISABLE_SMB) || !defined(USE_CURL_NTLM_CORE) |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_smb, |
| - | #endif |
| - | CURLPROTO_SMB, /* protocol */ |
| - | CURLPROTO_SMB, /* family */ |
| - | PROTOPT_CONN_REUSE, /* flags */ |
| - | PORT_SMB, /* defport */ |
| - | }; |
| - | |
| - | /* |
| - | * SMBS handler interface |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_smbs = { |
| - | "smbs", /* scheme */ |
| - | #if defined(CURL_DISABLE_SMB) || !defined(USE_CURL_NTLM_CORE) || \ |
| - | !defined(USE_SSL) |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_smb, |
| - | #endif |
| - | CURLPROTO_SMBS, /* protocol */ |
| - | CURLPROTO_SMB, /* family */ |
| - | PROTOPT_SSL | PROTOPT_CONN_REUSE, /* flags */ |
| - | PORT_SMBS, /* defport */ |
| - | }; |
| @@ -24,7 +24,8 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_smb; |
| - | extern const struct Curl_scheme Curl_scheme_smbs; |
| + | #if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) |
| + | extern const struct Curl_protocol Curl_protocol_smb; |
| + | #endif |
| #endif /* HEADER_CURL_SMB_H */ | |
| @@ -1984,7 +1984,7 @@ out: | |
| /* | |
| * SMTP protocol handler. | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_smtp = { |
| + | const struct Curl_protocol Curl_protocol_smtp = { |
| smtp_setup_connection, /* setup_connection */ | |
| smtp_do, /* do_it */ | |
| smtp_done, /* done */ | |
| @@ -2005,37 +2005,3 @@ static const struct Curl_protocol Curl_protocol_smtp = { | |
| }; | |
| #endif /* CURL_DISABLE_SMTP */ | |
| - | |
| - | /* |
| - | * SMTP protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_smtp = { |
| - | "smtp", /* scheme */ |
| - | #ifdef CURL_DISABLE_SMTP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_smtp, |
| - | #endif |
| - | CURLPROTO_SMTP, /* protocol */ |
| - | CURLPROTO_SMTP, /* family */ |
| - | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */ |
| - | PROTOPT_URLOPTIONS | PROTOPT_SSL_REUSE | PROTOPT_CONN_REUSE, |
| - | PORT_SMTP, /* defport */ |
| - | }; |
| - | |
| - | /* |
| - | * SMTPS protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_smtps = { |
| - | "smtps", /* scheme */ |
| - | #if defined(CURL_DISABLE_SMTP) || !defined(USE_SSL) |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_smtp, |
| - | #endif |
| - | CURLPROTO_SMTPS, /* protocol */ |
| - | CURLPROTO_SMTP, /* family */ |
| - | PROTOPT_CLOSEACTION | PROTOPT_SSL | /* flags */ |
| - | PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS | PROTOPT_CONN_REUSE, |
| - | PORT_SMTPS, /* defport */ |
| - | }; |
| @@ -23,7 +23,8 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_smtp; |
| - | extern const struct Curl_scheme Curl_scheme_smtps; |
| + | #ifndef CURL_DISABLE_SMTP |
| + | extern const struct Curl_protocol Curl_protocol_smtp; |
| + | #endif |
| #endif /* HEADER_CURL_SMTP_H */ | |
| @@ -1569,7 +1569,7 @@ static CURLcode telnet_do(struct Curl_easy *data, bool *done) | |
| /* | |
| * TELNET protocol handler. | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_telnet = { |
| + | const struct Curl_protocol Curl_protocol_telnet = { |
| ZERO_NULL, /* setup_connection */ | |
| telnet_do, /* do_it */ | |
| telnet_done, /* done */ | |
| @@ -1590,19 +1590,3 @@ static const struct Curl_protocol Curl_protocol_telnet = { | |
| }; | |
| #endif /* !CURL_DISABLE_TELNET */ | |
| - | |
| - | /* |
| - | * TELNET protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_telnet = { |
| - | "telnet", /* scheme */ |
| - | #ifdef CURL_DISABLE_TELNET |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_telnet, |
| - | #endif |
| - | CURLPROTO_TELNET, /* protocol */ |
| - | CURLPROTO_TELNET, /* family */ |
| - | PROTOPT_NONE | PROTOPT_NOURLQUERY, /* flags */ |
| - | PORT_TELNET, /* defport */ |
| - | }; |
| @@ -23,6 +23,8 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_telnet; |
| + | #ifndef CURL_DISABLE_TELNET |
| + | extern const struct Curl_protocol Curl_protocol_telnet; |
| + | #endif |
| #endif /* HEADER_CURL_TELNET_H */ | |
| @@ -1332,7 +1332,7 @@ static CURLcode tftp_setup_connection(struct Curl_easy *data, | |
| /* | |
| * TFTP protocol handler. | |
| */ | |
| - | static const struct Curl_protocol Curl_protocol_tftp = { |
| + | const struct Curl_protocol Curl_protocol_tftp = { |
| tftp_setup_connection, /* setup_connection */ | |
| tftp_do, /* do_it */ | |
| tftp_done, /* done */ | |
| @@ -1353,19 +1353,3 @@ static const struct Curl_protocol Curl_protocol_tftp = { | |
| }; | |
| #endif | |
| - | |
| - | /* |
| - | * TFTP protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_tftp = { |
| - | "tftp", /* scheme */ |
| - | #ifdef CURL_DISABLE_TFTP |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_tftp, |
| - | #endif |
| - | CURLPROTO_TFTP, /* protocol */ |
| - | CURLPROTO_TFTP, /* family */ |
| - | PROTOPT_NOTCPPROXY | PROTOPT_NOURLQUERY, /* flags */ |
| - | PORT_TFTP, /* defport */ |
| - | }; |
| @@ -23,7 +23,9 @@ | |
| * SPDX-License-Identifier: curl | |
| * | |
| ***************************************************************************/ | |
| - | extern const struct Curl_scheme Curl_scheme_tftp; |
| + | #ifndef CURL_DISABLE_TFTP |
| + | extern const struct Curl_protocol Curl_protocol_tftp; |
| + | #endif |
| #define TFTP_BLKSIZE_MIN 8 | |
| #define TFTP_BLKSIZE_MAX 65464 | |
| @@ -1433,80 +1433,6 @@ error: | |
| return NULL; | |
| } | |
| - | const struct Curl_scheme *Curl_get_scheme(const char *scheme) |
| - | { |
| - | return Curl_getn_scheme(scheme, strlen(scheme)); |
| - | } |
| - | |
| - | /* Returns a struct scheme pointer if the name is a known scheme. Check the |
| - | ->run struct field for non-NULL to figure out if an implementation is |
| - | present. */ |
| - | const struct Curl_scheme *Curl_getn_scheme(const char *scheme, size_t len) |
| - | { |
| - | /* table generated by schemetable.c: |
| - | 1. gcc schemetable.c && ./a.out |
| - | 2. check how small the table gets |
| - | 3. tweak the hash algorithm, then rerun from 1 |
| - | 4. when the table is good enough |
| - | 5. copy the table into this source code |
| - | 6. make sure this function uses the same hash function that worked for |
| - | schemetable.c |
| - | */ |
| - | static const struct Curl_scheme * const all_schemes[67] = { |
| - | &Curl_scheme_file, |
| - | &Curl_scheme_mqtts, NULL, |
| - | &Curl_scheme_gophers, NULL, |
| - | &Curl_scheme_rtmpe, |
| - | &Curl_scheme_smtp, |
| - | &Curl_scheme_sftp, |
| - | &Curl_scheme_smb, |
| - | &Curl_scheme_smtps, |
| - | &Curl_scheme_telnet, |
| - | &Curl_scheme_gopher, |
| - | &Curl_scheme_tftp, NULL, NULL, NULL, |
| - | &Curl_scheme_ftps, |
| - | &Curl_scheme_http, |
| - | &Curl_scheme_imap, |
| - | &Curl_scheme_rtmps, |
| - | &Curl_scheme_rtmpt, NULL, NULL, NULL, |
| - | &Curl_scheme_ldaps, |
| - | &Curl_scheme_wss, |
| - | &Curl_scheme_https, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| - | &Curl_scheme_rtsp, |
| - | &Curl_scheme_smbs, |
| - | &Curl_scheme_scp, NULL, NULL, NULL, |
| - | &Curl_scheme_pop3, NULL, NULL, |
| - | &Curl_scheme_rtmp, NULL, NULL, NULL, |
| - | &Curl_scheme_rtmpte, NULL, NULL, NULL, |
| - | &Curl_scheme_dict, NULL, NULL, NULL, |
| - | &Curl_scheme_mqtt, |
| - | &Curl_scheme_pop3s, |
| - | &Curl_scheme_imaps, NULL, |
| - | &Curl_scheme_ws, NULL, |
| - | &Curl_scheme_rtmpts, |
| - | &Curl_scheme_ldap, NULL, NULL, |
| - | &Curl_scheme_ftp, |
| - | }; |
| - | |
| - | if(len && (len <= 7)) { |
| - | const char *s = scheme; |
| - | size_t l = len; |
| - | const struct Curl_scheme *h; |
| - | unsigned int c = 978; |
| - | while(l) { |
| - | c <<= 5; |
| - | c += (unsigned int)Curl_raw_tolower(*s); |
| - | s++; |
| - | l--; |
| - | } |
| - | |
| - | h = all_schemes[c % 67]; |
| - | if(h && curl_strnequal(scheme, h->name, len) && !h->name[len]) |
| - | return h; |
| - | } |
| - | return NULL; |
| - | } |
| - | |
| static CURLcode findprotocol(struct Curl_easy *data, | |
| struct connectdata *conn, | |
| const char *protostr) | |
| @@ -69,13 +69,6 @@ CURLcode Curl_conn_meta_set(struct connectdata *conn, const char *key, | |
| void Curl_conn_meta_remove(struct connectdata *conn, const char *key); | |
| void *Curl_conn_meta_get(struct connectdata *conn, const char *key); | |
| - | /* Get protocol handler for a URI scheme |
| - | * @param scheme URI scheme, case-insensitive |
| - | * @return NULL of handler not found |
| - | */ |
| - | const struct Curl_scheme *Curl_get_scheme(const char *scheme); |
| - | const struct Curl_scheme *Curl_getn_scheme(const char *scheme, size_t len); |
| - | |
| #define CURL_DEFAULT_PROXY_PORT 1080 /* default proxy port unless specified */ | |
| #define CURL_DEFAULT_HTTPS_PROXY_PORT 443 /* default https proxy port unless | |
| specified */ | |
| @@ -26,60 +26,6 @@ | |
| /* This file is for lib internal stuff */ | |
| #include "curl_setup.h" | |
| - | #define PORT_FTP 21 |
| - | #define PORT_FTPS 990 |
| - | #define PORT_TELNET 23 |
| - | #define PORT_HTTP 80 |
| - | #define PORT_HTTPS 443 |
| - | #define PORT_DICT 2628 |
| - | #define PORT_LDAP 389 |
| - | #define PORT_LDAPS 636 |
| - | #define PORT_TFTP 69 |
| - | #define PORT_SSH 22 |
| - | #define PORT_IMAP 143 |
| - | #define PORT_IMAPS 993 |
| - | #define PORT_POP3 110 |
| - | #define PORT_POP3S 995 |
| - | #define PORT_SMB 445 |
| - | #define PORT_SMBS 445 |
| - | #define PORT_SMTP 25 |
| - | #define PORT_SMTPS 465 /* sometimes called SSMTP */ |
| - | #define PORT_RTSP 554 |
| - | #define PORT_RTMP 1935 |
| - | #define PORT_RTMPT PORT_HTTP |
| - | #define PORT_RTMPS PORT_HTTPS |
| - | #define PORT_GOPHER 70 |
| - | #define PORT_MQTT 1883 |
| - | #define PORT_MQTTS 8883 |
| - | |
| - | #ifndef CURL_DISABLE_WEBSOCKETS |
| - | /* CURLPROTO_GOPHERS (29) is the highest publicly used protocol bit number, |
| - | * the rest are internal information. If we use higher bits we only do this on |
| - | * platforms that have a >= 64-bit type and then we use such a type for the |
| - | * protocol fields in the protocol handler. |
| - | */ |
| - | #define CURLPROTO_WS (1L << 30) |
| - | #define CURLPROTO_WSS ((curl_prot_t)1 << 31) |
| - | #else |
| - | #define CURLPROTO_WS 0L |
| - | #define CURLPROTO_WSS 0L |
| - | #endif |
| - | |
| - | #define CURLPROTO_MQTTS (1LL << 32) |
| - | |
| - | #define CURLPROTO_64ALL ((uint64_t)0xffffffffffffffff) |
| - | |
| - | /* the default protocols accepting a redirect to */ |
| - | #define CURLPROTO_REDIR (CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FTP | \ |
| - | CURLPROTO_FTPS) |
| - | |
| - | typedef curl_off_t curl_prot_t; |
| - | |
| - | /* This mask is for all the old protocols that are provided and defined in the |
| - | public header and shall exclude protocols added since which are not exposed |
| - | in the API */ |
| - | #define CURLPROTO_MASK 0x3ffffff |
| - | |
| #define CURL_DEFAULT_USER "anonymous" | |
| #define CURL_DEFAULT_PASSWORD "[email protected]" | |
| @@ -89,23 +35,6 @@ typedef curl_off_t curl_prot_t; | |
| #define CURL_PREFER_LF_LINEENDS | |
| #endif | |
| - | /* Convenience defines for checking protocols or their SSL based version. Each |
| - | protocol handler should only ever have a single CURLPROTO_ in its protocol |
| - | field. */ |
| - | #define PROTO_FAMILY_HTTP (CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_WS | \ |
| - | CURLPROTO_WSS) |
| - | #define PROTO_FAMILY_FTP (CURLPROTO_FTP | CURLPROTO_FTPS) |
| - | #define PROTO_FAMILY_POP3 (CURLPROTO_POP3 | CURLPROTO_POP3S) |
| - | #define PROTO_FAMILY_SMB (CURLPROTO_SMB | CURLPROTO_SMBS) |
| - | #define PROTO_FAMILY_SMTP (CURLPROTO_SMTP | CURLPROTO_SMTPS) |
| - | #define PROTO_FAMILY_SSH (CURLPROTO_SCP | CURLPROTO_SFTP) |
| - | |
| - | #if !defined(CURL_DISABLE_FTP) || defined(USE_SSH) || \ |
| - | !defined(CURL_DISABLE_POP3) |
| - | /* these protocols support CURLOPT_DIRLISTONLY */ |
| - | #define CURL_LIST_ONLY_PROTOCOL 1 |
| - | #endif |
| - | |
| #define DEFAULT_CONNCACHE_SIZE 5 | |
| /* length of longest IPv6 address string including the trailing null */ | |
| @@ -155,6 +84,7 @@ typedef CURLcode (Curl_recv)(struct Curl_easy *data, /* transfer */ | |
| size_t *pnread); /* how much received */ | |
| #include "mime.h" | |
| + | #include "protocol.h" |
| #include "ftp.h" | |
| #include "http.h" | |
| #include "smb.h" | |
| @@ -391,140 +321,6 @@ struct hostname { | |
| #define FIRSTSOCKET 0 | |
| #define SECONDARYSOCKET 1 | |
| - | /* |
| - | * Specific protocol handler. |
| - | */ |
| - | |
| - | struct Curl_protocol { |
| - | /* Complement to setup_connection_internals(). This is done before the |
| - | transfer "owns" the connection. */ |
| - | CURLcode (*setup_connection)(struct Curl_easy *data, |
| - | struct connectdata *conn); |
| - | |
| - | /* These two functions MUST be set to be protocol dependent */ |
| - | CURLcode (*do_it)(struct Curl_easy *data, bool *done); |
| - | CURLcode (*done)(struct Curl_easy *, CURLcode, bool); |
| - | |
| - | /* If the curl_do() function is better made in two halves, this |
| - | * curl_do_more() function will be called afterwards, if set. For example |
| - | * for doing the FTP stuff after the PASV/PORT command. |
| - | */ |
| - | CURLcode (*do_more)(struct Curl_easy *, int *); |
| - | |
| - | /* This function *MAY* be set to a protocol-dependent function that is run |
| - | * after the connect() and everything is done, as a step in the connection. |
| - | * The 'done' pointer points to a bool that should be set to TRUE if the |
| - | * function completes before return. If it does not complete, the caller |
| - | * should call the ->connecting() function until it is. |
| - | */ |
| - | CURLcode (*connect_it)(struct Curl_easy *data, bool *done); |
| - | |
| - | /* See above. */ |
| - | CURLcode (*connecting)(struct Curl_easy *data, bool *done); |
| - | CURLcode (*doing)(struct Curl_easy *data, bool *done); |
| - | |
| - | /* Called from the multi interface during the PROTOCONNECT phase, and it |
| - | should then return a proper fd set */ |
| - | CURLcode (*proto_pollset)(struct Curl_easy *data, |
| - | struct easy_pollset *ps); |
| - | |
| - | /* Called from the multi interface during the DOING phase, and it should |
| - | then return a proper fd set */ |
| - | CURLcode (*doing_pollset)(struct Curl_easy *data, |
| - | struct easy_pollset *ps); |
| - | |
| - | /* Called from the multi interface during the DO_MORE phase, and it should |
| - | then return a proper fd set */ |
| - | CURLcode (*domore_pollset)(struct Curl_easy *data, |
| - | struct easy_pollset *ps); |
| - | |
| - | /* Called from the multi interface during the DO_DONE, PERFORM and |
| - | WAITPERFORM phases, and it should then return a proper fd set. Not setting |
| - | this will make libcurl use the generic default one. */ |
| - | CURLcode (*perform_pollset)(struct Curl_easy *data, |
| - | struct easy_pollset *ps); |
| - | |
| - | /* This function *MAY* be set to a protocol-dependent function that is run |
| - | * by the curl_disconnect(), as a step in the disconnection. If the handler |
| - | * is called because the connection has been considered dead, |
| - | * dead_connection is set to TRUE. The connection is (again) associated with |
| - | * the transfer here. |
| - | */ |
| - | CURLcode (*disconnect)(struct Curl_easy *, struct connectdata *, |
| - | bool dead_connection); |
| - | |
| - | /* If used, this function gets called from transfer.c to |
| - | allow the protocol to do extra handling in writing response to |
| - | the client. */ |
| - | CURLcode (*write_resp)(struct Curl_easy *data, const char *buf, size_t blen, |
| - | bool is_eos); |
| - | |
| - | /* If used, this function gets called from transfer.c to |
| - | allow the protocol to do extra handling in writing a single response |
| - | header line to the client. */ |
| - | CURLcode (*write_resp_hd)(struct Curl_easy *data, |
| - | const char *hd, size_t hdlen, bool is_eos); |
| - | |
| - | /* If used, this function checks for a connection managed by this |
| - | protocol and currently not in use, if it should be considered dead. */ |
| - | bool (*connection_is_dead)(struct Curl_easy *data, |
| - | struct connectdata *conn); |
| - | |
| - | /* attach() attaches this transfer to this connection */ |
| - | void (*attach)(struct Curl_easy *data, struct connectdata *conn); |
| - | |
| - | /* return CURLE_OK if a redirect to `newurl` should be followed, |
| - | CURLE_TOO_MANY_REDIRECTS otherwise. May alter `data` to change |
| - | the way the follow request is performed. */ |
| - | CURLcode (*follow)(struct Curl_easy *data, const char *newurl, |
| - | followtype type); |
| - | }; |
| - | |
| - | struct Curl_scheme { |
| - | const char *name; /* URL scheme name in lowercase */ |
| - | const struct Curl_protocol *run; /* implementation */ |
| - | curl_prot_t protocol; /* See CURLPROTO_* - this needs to be the single |
| - | specific protocol bit */ |
| - | curl_prot_t family; /* single bit for protocol family; the non-TLS name |
| - | of the protocol this is */ |
| - | uint32_t flags; /* Extra particular characteristics, see PROTOPT_* */ |
| - | uint16_t defport; /* Default port. */ |
| - | }; |
| - | |
| - | #define PROTOPT_NONE 0 /* nothing extra */ |
| - | #define PROTOPT_SSL (1 << 0) /* uses SSL */ |
| - | #define PROTOPT_DUAL (1 << 1) /* this protocol uses two connections */ |
| - | #define PROTOPT_CLOSEACTION (1 << 2) /* need action before socket close */ |
| - | /* some protocols will have to call the underlying functions without regard to |
| - | what exact state the socket signals. IE even if the socket says "readable", |
| - | the send function might need to be called while uploading, or vice versa. |
| - | */ |
| - | #define PROTOPT_DIRLOCK (1 << 3) |
| - | #define PROTOPT_NONETWORK (1 << 4) /* protocol does not use the network! */ |
| - | #define PROTOPT_NEEDSPWD (1 << 5) /* needs a password, and if none is set it |
| - | gets a default */ |
| - | #define PROTOPT_NOURLQUERY (1 << 6) /* protocol cannot handle |
| - | URL query strings (?foo=bar) ! */ |
| - | #define PROTOPT_CREDSPERREQUEST (1 << 7) /* requires login credentials per |
| - | request instead of per |
| - | connection */ |
| - | #define PROTOPT_ALPN (1 << 8) /* set ALPN for this */ |
| - | /* (1 << 9) was PROTOPT_STREAM, now free */ |
| - | #define PROTOPT_URLOPTIONS (1 << 10) /* allow options part in the userinfo |
| - | field of the URL */ |
| - | #define PROTOPT_PROXY_AS_HTTP (1 << 11) /* allow this non-HTTP scheme over a |
| - | HTTP proxy as HTTP proxies may know |
| - | this protocol and act as |
| - | a gateway */ |
| - | #define PROTOPT_WILDCARD (1 << 12) /* protocol supports wildcard matching */ |
| - | #define PROTOPT_USERPWDCTRL (1 << 13) /* Allow "control bytes" (< 32 ASCII) in |
| - | username and password */ |
| - | #define PROTOPT_NOTCPPROXY (1 << 14) /* this protocol cannot proxy over TCP */ |
| - | #define PROTOPT_SSL_REUSE (1 << 15) /* this protocol may reuse an existing |
| - | SSL connection in the same family |
| - | without having PROTOPT_SSL. */ |
| - | #define PROTOPT_CONN_REUSE (1 << 16) /* this protocol can reuse connections */ |
| - | |
| #define TRNSPRT_NONE 0 | |
| #define TRNSPRT_TCP 3 | |
| #define TRNSPRT_UDP 4 | |
| @@ -29,9 +29,6 @@ | |
| extern const struct Curl_protocol Curl_protocol_sftp; | |
| extern const struct Curl_protocol Curl_protocol_scp; | |
| - | extern const struct Curl_scheme Curl_scheme_sftp; |
| - | extern const struct Curl_scheme Curl_scheme_scp; |
| - | |
| #ifdef USE_SSH | |
| #ifdef USE_LIBSSH2 | |
| @@ -331,34 +331,3 @@ CURLcode Curl_ssh_range(struct Curl_easy *data, | |
| } | |
| #endif /* USE_SSH */ | |
| - | |
| - | /* |
| - | * SFTP protocol handler. |
| - | */ |
| - | const struct Curl_scheme Curl_scheme_sftp = { |
| - | "SFTP", /* scheme */ |
| - | #ifndef USE_SSH |
| - | NULL, |
| - | #else |
| - | &Curl_protocol_sftp, |
| - | #endif |
| - | CURLPROTO_SFTP, /* protocol */ |
| - | CURLPROTO_SFTP, /* family */ |
| - | PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | /* flags */ |
| - | PROTOPT_NOURLQUERY | PROTOPT_CONN_REUSE, |
| - | PORT_SSH /* defport */ |
| - | }; |
| - | |
| - | const struct Curl_scheme Curl_scheme_scp = { |
| - | "SCP", /* scheme */ |
| - | #ifndef USE_SSH |
| - | NULL, |
| - | #else |
| - | &Curl_protocol_scp, |
| - | #endif |
| - | CURLPROTO_SCP, /* protocol */ |
| - | CURLPROTO_SCP, /* family */ |
| - | PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | /* flags */ |
| - | PROTOPT_NOURLQUERY | PROTOPT_CONN_REUSE, |
| - | PORT_SSH, /* defport */ |
| - | }; |
| @@ -1915,7 +1915,7 @@ out: | |
| return result; | |
| } | |
| - | static const struct Curl_protocol Curl_protocol_ws = { |
| + | const struct Curl_protocol Curl_protocol_ws = { |
| ws_setup_conn, /* setup_connection */ | |
| Curl_http, /* do_it */ | |
| Curl_http_done, /* done */ | |
| @@ -1980,32 +1980,3 @@ CURL_EXTERN CURLcode curl_ws_start_frame(CURL *curl, | |
| } | |
| #endif /* !CURL_DISABLE_WEBSOCKETS */ | |
| - | |
| - | const struct Curl_scheme Curl_scheme_ws = { |
| - | "WS", /* scheme */ |
| - | #ifdef CURL_DISABLE_WEBSOCKETS |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_ws, |
| - | #endif |
| - | CURLPROTO_WS, /* protocol */ |
| - | CURLPROTO_HTTP, /* family */ |
| - | PROTOPT_CREDSPERREQUEST | /* flags */ |
| - | PROTOPT_USERPWDCTRL, |
| - | PORT_HTTP /* defport */ |
| - | } |
| - | ; |
| - | |
| - | const struct Curl_scheme Curl_scheme_wss = { |
| - | "WSS", /* scheme */ |
| - | #if defined(CURL_DISABLE_WEBSOCKETS) || !defined(USE_SSL) |
| - | ZERO_NULL, |
| - | #else |
| - | &Curl_protocol_ws, |
| - | #endif |
| - | CURLPROTO_WSS, /* protocol */ |
| - | CURLPROTO_HTTP, /* family */ |
| - | PROTOPT_SSL | PROTOPT_CREDSPERREQUEST | /* flags */ |
| - | PROTOPT_USERPWDCTRL, |
| - | PORT_HTTPS /* defport */ |
| - | }; |
| @@ -25,11 +25,10 @@ | |
| ***************************************************************************/ | |
| #include "curl_setup.h" | |
| - | extern const struct Curl_scheme Curl_scheme_ws; |
| - | extern const struct Curl_scheme Curl_scheme_wss; |
| - | |
| #if !defined(CURL_DISABLE_WEBSOCKETS) && !defined(CURL_DISABLE_HTTP) | |
| + | extern const struct Curl_protocol Curl_protocol_ws; |
| + | |
| /* meta key for storing protocol meta at connection */ | |
| #define CURL_META_PROTO_WS_CONN "meta:proto:ws:conn" | |