1*6236dae4SAndroid Build Coastguard Worker #ifndef HEADER_CURL_PINGPONG_H 2*6236dae4SAndroid Build Coastguard Worker #define HEADER_CURL_PINGPONG_H 3*6236dae4SAndroid Build Coastguard Worker /*************************************************************************** 4*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _ 5*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| | 6*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | | 7*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___ 8*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____| 9*6236dae4SAndroid Build Coastguard Worker * 10*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al. 11*6236dae4SAndroid Build Coastguard Worker * 12*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which 13*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms 14*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html. 15*6236dae4SAndroid Build Coastguard Worker * 16*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell 17*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is 18*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file. 19*6236dae4SAndroid Build Coastguard Worker * 20*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 21*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied. 22*6236dae4SAndroid Build Coastguard Worker * 23*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl 24*6236dae4SAndroid Build Coastguard Worker * 25*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/ 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h" 28*6236dae4SAndroid Build Coastguard Worker 29*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_IMAP) || !defined(CURL_DISABLE_FTP) || \ 30*6236dae4SAndroid Build Coastguard Worker !defined(CURL_DISABLE_POP3) || !defined(CURL_DISABLE_SMTP) 31*6236dae4SAndroid Build Coastguard Worker #define USE_PINGPONG 32*6236dae4SAndroid Build Coastguard Worker #endif 33*6236dae4SAndroid Build Coastguard Worker 34*6236dae4SAndroid Build Coastguard Worker /* forward-declaration, this is defined in urldata.h */ 35*6236dae4SAndroid Build Coastguard Worker struct connectdata; 36*6236dae4SAndroid Build Coastguard Worker 37*6236dae4SAndroid Build Coastguard Worker typedef enum { 38*6236dae4SAndroid Build Coastguard Worker PPTRANSFER_BODY, /* yes do transfer a body */ 39*6236dae4SAndroid Build Coastguard Worker PPTRANSFER_INFO, /* do still go through to get info/headers */ 40*6236dae4SAndroid Build Coastguard Worker PPTRANSFER_NONE /* do not get anything and do not get info */ 41*6236dae4SAndroid Build Coastguard Worker } curl_pp_transfer; 42*6236dae4SAndroid Build Coastguard Worker 43*6236dae4SAndroid Build Coastguard Worker /* 44*6236dae4SAndroid Build Coastguard Worker * 'pingpong' is the generic struct used for protocols doing server<->client 45*6236dae4SAndroid Build Coastguard Worker * conversations in a back-and-forth style such as FTP, IMAP, POP3, SMTP etc. 46*6236dae4SAndroid Build Coastguard Worker * 47*6236dae4SAndroid Build Coastguard Worker * It holds response cache and non-blocking sending data. 48*6236dae4SAndroid Build Coastguard Worker */ 49*6236dae4SAndroid Build Coastguard Worker struct pingpong { 50*6236dae4SAndroid Build Coastguard Worker size_t nread_resp; /* number of bytes currently read of a server response */ 51*6236dae4SAndroid Build Coastguard Worker bool pending_resp; /* set TRUE when a server response is pending or in 52*6236dae4SAndroid Build Coastguard Worker progress, and is cleared once the last response is 53*6236dae4SAndroid Build Coastguard Worker read */ 54*6236dae4SAndroid Build Coastguard Worker char *sendthis; /* pointer to a buffer that is to be sent to the server */ 55*6236dae4SAndroid Build Coastguard Worker size_t sendleft; /* number of bytes left to send from the sendthis buffer */ 56*6236dae4SAndroid Build Coastguard Worker size_t sendsize; /* total size of the sendthis buffer */ 57*6236dae4SAndroid Build Coastguard Worker struct curltime response; /* set to Curl_now() when a command has been sent 58*6236dae4SAndroid Build Coastguard Worker off, used to time-out response reading */ 59*6236dae4SAndroid Build Coastguard Worker timediff_t response_time; /* When no timeout is given, this is the amount of 60*6236dae4SAndroid Build Coastguard Worker milliseconds we await for a server response. */ 61*6236dae4SAndroid Build Coastguard Worker struct dynbuf sendbuf; 62*6236dae4SAndroid Build Coastguard Worker struct dynbuf recvbuf; 63*6236dae4SAndroid Build Coastguard Worker size_t overflow; /* number of bytes left after a final response line */ 64*6236dae4SAndroid Build Coastguard Worker size_t nfinal; /* number of bytes in the final response line, which 65*6236dae4SAndroid Build Coastguard Worker after a match is first in the receice buffer */ 66*6236dae4SAndroid Build Coastguard Worker 67*6236dae4SAndroid Build Coastguard Worker /* Function pointers the protocols MUST implement and provide for the 68*6236dae4SAndroid Build Coastguard Worker pingpong layer to function */ 69*6236dae4SAndroid Build Coastguard Worker 70*6236dae4SAndroid Build Coastguard Worker CURLcode (*statemachine)(struct Curl_easy *data, struct connectdata *conn); 71*6236dae4SAndroid Build Coastguard Worker bool (*endofresp)(struct Curl_easy *data, struct connectdata *conn, 72*6236dae4SAndroid Build Coastguard Worker char *ptr, size_t len, int *code); 73*6236dae4SAndroid Build Coastguard Worker }; 74*6236dae4SAndroid Build Coastguard Worker 75*6236dae4SAndroid Build Coastguard Worker #define PINGPONG_SETUP(pp,s,e) \ 76*6236dae4SAndroid Build Coastguard Worker do { \ 77*6236dae4SAndroid Build Coastguard Worker pp->response_time = RESP_TIMEOUT; \ 78*6236dae4SAndroid Build Coastguard Worker pp->statemachine = s; \ 79*6236dae4SAndroid Build Coastguard Worker pp->endofresp = e; \ 80*6236dae4SAndroid Build Coastguard Worker } while(0) 81*6236dae4SAndroid Build Coastguard Worker 82*6236dae4SAndroid Build Coastguard Worker /* 83*6236dae4SAndroid Build Coastguard Worker * Curl_pp_statemach() 84*6236dae4SAndroid Build Coastguard Worker * 85*6236dae4SAndroid Build Coastguard Worker * called repeatedly until done. Set 'wait' to make it wait a while on the 86*6236dae4SAndroid Build Coastguard Worker * socket if there is no traffic. 87*6236dae4SAndroid Build Coastguard Worker */ 88*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_pp_statemach(struct Curl_easy *data, struct pingpong *pp, 89*6236dae4SAndroid Build Coastguard Worker bool block, bool disconnecting); 90*6236dae4SAndroid Build Coastguard Worker 91*6236dae4SAndroid Build Coastguard Worker /* initialize stuff to prepare for reading a fresh new response */ 92*6236dae4SAndroid Build Coastguard Worker void Curl_pp_init(struct pingpong *pp); 93*6236dae4SAndroid Build Coastguard Worker 94*6236dae4SAndroid Build Coastguard Worker /* Returns timeout in ms. 0 or negative number means the timeout has already 95*6236dae4SAndroid Build Coastguard Worker triggered */ 96*6236dae4SAndroid Build Coastguard Worker timediff_t Curl_pp_state_timeout(struct Curl_easy *data, 97*6236dae4SAndroid Build Coastguard Worker struct pingpong *pp, bool disconnecting); 98*6236dae4SAndroid Build Coastguard Worker 99*6236dae4SAndroid Build Coastguard Worker 100*6236dae4SAndroid Build Coastguard Worker /*********************************************************************** 101*6236dae4SAndroid Build Coastguard Worker * 102*6236dae4SAndroid Build Coastguard Worker * Curl_pp_sendf() 103*6236dae4SAndroid Build Coastguard Worker * 104*6236dae4SAndroid Build Coastguard Worker * Send the formatted string as a command to a pingpong server. Note that 105*6236dae4SAndroid Build Coastguard Worker * the string should not have any CRLF appended, as this function will 106*6236dae4SAndroid Build Coastguard Worker * append the necessary things itself. 107*6236dae4SAndroid Build Coastguard Worker * 108*6236dae4SAndroid Build Coastguard Worker * made to never block 109*6236dae4SAndroid Build Coastguard Worker */ 110*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_pp_sendf(struct Curl_easy *data, 111*6236dae4SAndroid Build Coastguard Worker struct pingpong *pp, 112*6236dae4SAndroid Build Coastguard Worker const char *fmt, ...) CURL_PRINTF(3, 4); 113*6236dae4SAndroid Build Coastguard Worker 114*6236dae4SAndroid Build Coastguard Worker /*********************************************************************** 115*6236dae4SAndroid Build Coastguard Worker * 116*6236dae4SAndroid Build Coastguard Worker * Curl_pp_vsendf() 117*6236dae4SAndroid Build Coastguard Worker * 118*6236dae4SAndroid Build Coastguard Worker * Send the formatted string as a command to a pingpong server. Note that 119*6236dae4SAndroid Build Coastguard Worker * the string should not have any CRLF appended, as this function will 120*6236dae4SAndroid Build Coastguard Worker * append the necessary things itself. 121*6236dae4SAndroid Build Coastguard Worker * 122*6236dae4SAndroid Build Coastguard Worker * made to never block 123*6236dae4SAndroid Build Coastguard Worker */ 124*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_pp_vsendf(struct Curl_easy *data, 125*6236dae4SAndroid Build Coastguard Worker struct pingpong *pp, 126*6236dae4SAndroid Build Coastguard Worker const char *fmt, 127*6236dae4SAndroid Build Coastguard Worker va_list args) CURL_PRINTF(3, 0); 128*6236dae4SAndroid Build Coastguard Worker 129*6236dae4SAndroid Build Coastguard Worker /* 130*6236dae4SAndroid Build Coastguard Worker * Curl_pp_readresp() 131*6236dae4SAndroid Build Coastguard Worker * 132*6236dae4SAndroid Build Coastguard Worker * Reads a piece of a server response. 133*6236dae4SAndroid Build Coastguard Worker */ 134*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_pp_readresp(struct Curl_easy *data, 135*6236dae4SAndroid Build Coastguard Worker int sockindex, 136*6236dae4SAndroid Build Coastguard Worker struct pingpong *pp, 137*6236dae4SAndroid Build Coastguard Worker int *code, /* return the server code if done */ 138*6236dae4SAndroid Build Coastguard Worker size_t *size); /* size of the response */ 139*6236dae4SAndroid Build Coastguard Worker 140*6236dae4SAndroid Build Coastguard Worker bool Curl_pp_needs_flush(struct Curl_easy *data, 141*6236dae4SAndroid Build Coastguard Worker struct pingpong *pp); 142*6236dae4SAndroid Build Coastguard Worker 143*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_pp_flushsend(struct Curl_easy *data, 144*6236dae4SAndroid Build Coastguard Worker struct pingpong *pp); 145*6236dae4SAndroid Build Coastguard Worker 146*6236dae4SAndroid Build Coastguard Worker /* call this when a pingpong connection is disconnected */ 147*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_pp_disconnect(struct pingpong *pp); 148*6236dae4SAndroid Build Coastguard Worker 149*6236dae4SAndroid Build Coastguard Worker int Curl_pp_getsock(struct Curl_easy *data, struct pingpong *pp, 150*6236dae4SAndroid Build Coastguard Worker curl_socket_t *socks); 151*6236dae4SAndroid Build Coastguard Worker 152*6236dae4SAndroid Build Coastguard Worker 153*6236dae4SAndroid Build Coastguard Worker /*********************************************************************** 154*6236dae4SAndroid Build Coastguard Worker * 155*6236dae4SAndroid Build Coastguard Worker * Curl_pp_moredata() 156*6236dae4SAndroid Build Coastguard Worker * 157*6236dae4SAndroid Build Coastguard Worker * Returns whether there are still more data in the cache and so a call 158*6236dae4SAndroid Build Coastguard Worker * to Curl_pp_readresp() will not block. 159*6236dae4SAndroid Build Coastguard Worker */ 160*6236dae4SAndroid Build Coastguard Worker bool Curl_pp_moredata(struct pingpong *pp); 161*6236dae4SAndroid Build Coastguard Worker 162*6236dae4SAndroid Build Coastguard Worker #endif /* HEADER_CURL_PINGPONG_H */ 163