1 /***************************************************************************
3 * Project ___| | | | _ \| |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
8 * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
10 * This software is licensed as described in the file COPYING, which
11 * you should have received as part of this distribution. The terms
12 * are also available at https://curl.haxx.se/docs/copyright.html.
14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15 * copies of the Software, and permit persons to whom the Software is
16 * furnished to do so, under the terms of the COPYING file.
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
21 ***************************************************************************/
23 #include "curl_setup.h"
25 #ifdef HAVE_NETINET_IN_H
26 #include <netinet/in.h>
29 #ifdef HAVE_LINUX_TCP_H
30 #include <linux/tcp.h>
33 #include <curl/curl.h>
38 #include "vtls/vtls.h"
42 #include "non-ascii.h"
47 /* The last 3 #include files should be in this order */
48 #include "curl_printf.h"
49 #include "curl_memory.h"
52 #ifdef CURL_DO_LINEEND_CONV
54 * convert_lineends() changes CRLF (\r\n) end-of-line markers to a single LF
55 * (\n), with special processing for CRLF sequences that are split between two
56 * blocks of data. Remaining, bare CRs are changed to LFs. The possibly new
57 * size of the data is returned.
59 static size_t convert_lineends(struct Curl_easy *data,
60 char *startPtr, size_t size)
65 if((startPtr == NULL) || (size < 1)) {
69 if(data->state.prev_block_had_trailing_cr) {
70 /* The previous block of incoming data
71 had a trailing CR, which was turned into a LF. */
72 if(*startPtr == '\n') {
73 /* This block of incoming data starts with the
74 previous block's LF so get rid of it */
75 memmove(startPtr, startPtr + 1, size-1);
77 /* and it wasn't a bare CR but a CRLF conversion instead */
78 data->state.crlf_conversions++;
80 data->state.prev_block_had_trailing_cr = FALSE; /* reset the flag */
83 /* find 1st CR, if any */
84 inPtr = outPtr = memchr(startPtr, '\r', size);
86 /* at least one CR, now look for CRLF */
87 while(inPtr < (startPtr + size-1)) {
88 /* note that it's size-1, so we'll never look past the last byte */
89 if(memcmp(inPtr, "\r\n", 2) == 0) {
90 /* CRLF found, bump past the CR and copy the NL */
93 /* keep track of how many CRLFs we converted */
94 data->state.crlf_conversions++;
98 /* lone CR, move LF instead */
102 /* not a CRLF nor a CR, just copy whatever it is */
108 } /* end of while loop */
110 if(inPtr < startPtr + size) {
111 /* handle last byte */
113 /* deal with a CR at the end of the buffer */
114 *outPtr = '\n'; /* copy a NL instead */
115 /* note that a CRLF might be split across two blocks */
116 data->state.prev_block_had_trailing_cr = TRUE;
124 if(outPtr < startPtr + size)
125 /* tidy up by null terminating the now shorter data */
128 return (outPtr - startPtr);
132 #endif /* CURL_DO_LINEEND_CONV */
134 #ifdef USE_RECV_BEFORE_SEND_WORKAROUND
135 bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex)
137 struct postponed_data * const psnd = &(conn->postponed[sockindex]);
138 return psnd->buffer && psnd->allocated_size &&
139 psnd->recv_size > psnd->recv_processed;
142 static void pre_receive_plain(struct connectdata *conn, int num)
144 const curl_socket_t sockfd = conn->sock[num];
145 struct postponed_data * const psnd = &(conn->postponed[num]);
146 size_t bytestorecv = psnd->allocated_size - psnd->recv_size;
147 /* WinSock will destroy unread received data if send() is
149 To avoid lossage of received data, recv() must be
150 performed before every send() if any incoming data is
151 available. However, skip this, if buffer is already full. */
152 if((conn->handler->protocol&PROTO_FAMILY_HTTP) != 0 &&
153 conn->recv[num] == Curl_recv_plain &&
154 (!psnd->buffer || bytestorecv)) {
155 const int readymask = Curl_socket_check(sockfd, CURL_SOCKET_BAD,
157 if(readymask != -1 && (readymask & CURL_CSELECT_IN) != 0) {
158 /* Have some incoming data */
160 /* Use buffer double default size for intermediate buffer */
161 psnd->allocated_size = 2 * conn->data->set.buffer_size;
162 psnd->buffer = malloc(psnd->allocated_size);
164 psnd->recv_processed = 0;
166 psnd->bindsock = sockfd; /* Used only for DEBUGASSERT */
167 #endif /* DEBUGBUILD */
168 bytestorecv = psnd->allocated_size;
172 DEBUGASSERT(psnd->bindsock == sockfd);
173 recvedbytes = sread(sockfd, psnd->buffer + psnd->recv_size,
176 psnd->recv_size += recvedbytes;
179 psnd->allocated_size = 0;
184 static ssize_t get_pre_recved(struct connectdata *conn, int num, char *buf,
187 struct postponed_data * const psnd = &(conn->postponed[num]);
192 DEBUGASSERT(psnd->allocated_size > 0);
193 DEBUGASSERT(psnd->recv_size <= psnd->allocated_size);
194 DEBUGASSERT(psnd->recv_processed <= psnd->recv_size);
195 /* Check and process data that already received and storied in internal
196 intermediate buffer */
197 if(psnd->recv_size > psnd->recv_processed) {
198 DEBUGASSERT(psnd->bindsock == conn->sock[num]);
199 copysize = CURLMIN(len, psnd->recv_size - psnd->recv_processed);
200 memcpy(buf, psnd->buffer + psnd->recv_processed, copysize);
201 psnd->recv_processed += copysize;
204 copysize = 0; /* buffer was allocated, but nothing was received */
206 /* Free intermediate buffer if it has no unprocessed data */
207 if(psnd->recv_processed == psnd->recv_size) {
210 psnd->allocated_size = 0;
212 psnd->recv_processed = 0;
214 psnd->bindsock = CURL_SOCKET_BAD;
215 #endif /* DEBUGBUILD */
217 return (ssize_t)copysize;
219 #else /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
220 /* Use "do-nothing" macros instead of functions when workaround not used */
221 bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex)
227 #define pre_receive_plain(c,n) do {} WHILE_FALSE
228 #define get_pre_recved(c,n,b,l) 0
229 #endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
231 /* Curl_infof() is for info message along the way */
233 void Curl_infof(struct Curl_easy *data, const char *fmt, ...)
235 if(data && data->set.verbose) {
238 char print_buffer[2048 + 1];
240 vsnprintf(print_buffer, sizeof(print_buffer), fmt, ap);
242 len = strlen(print_buffer);
243 Curl_debug(data, CURLINFO_TEXT, print_buffer, len, NULL);
247 /* Curl_failf() is for messages stating why we failed.
248 * The message SHALL NOT include any LF or CR.
251 void Curl_failf(struct Curl_easy *data, const char *fmt, ...)
253 if(data->set.verbose || data->set.errorbuffer) {
256 char error[CURL_ERROR_SIZE + 2];
258 vsnprintf(error, CURL_ERROR_SIZE, fmt, ap);
261 if(data->set.errorbuffer && !data->state.errorbuf) {
262 strcpy(data->set.errorbuffer, error);
263 data->state.errorbuf = TRUE; /* wrote error string */
265 if(data->set.verbose) {
268 Curl_debug(data, CURLINFO_TEXT, error, len, NULL);
274 /* Curl_sendf() sends formatted data to the server */
275 CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *conn,
276 const char *fmt, ...)
278 struct Curl_easy *data = conn->data;
279 ssize_t bytes_written;
281 CURLcode result = CURLE_OK;
286 s = vaprintf(fmt, ap); /* returns an allocated string */
289 return CURLE_OUT_OF_MEMORY; /* failure */
292 write_len = strlen(s);
296 /* Write the buffer to the socket */
297 result = Curl_write(conn, sockfd, sptr, write_len, &bytes_written);
302 if(data->set.verbose)
303 Curl_debug(data, CURLINFO_DATA_OUT, sptr, (size_t)bytes_written, conn);
305 if((size_t)bytes_written != write_len) {
306 /* if not all was written at once, we must advance the pointer, decrease
307 the size left and try again! */
308 write_len -= bytes_written;
309 sptr += bytes_written;
315 free(s); /* free the output string */
321 * Curl_write() is an internal write function that sends data to the
322 * server. Works with plain sockets, SCP, SSL or kerberos.
324 * If the write would block (CURLE_AGAIN), we return CURLE_OK and
325 * (*written == 0). Otherwise we return regular CURLcode value.
327 CURLcode Curl_write(struct connectdata *conn,
328 curl_socket_t sockfd,
333 ssize_t bytes_written;
334 CURLcode result = CURLE_OK;
335 int num = (sockfd == conn->sock[SECONDARYSOCKET]);
337 bytes_written = conn->send[num](conn, num, mem, len, &result);
339 *written = bytes_written;
340 if(bytes_written >= 0)
341 /* we completely ignore the curlcode value when subzero is not returned */
344 /* handle CURLE_AGAIN or a send failure */
351 /* general send failure */
352 return CURLE_SEND_ERROR;
355 /* we got a specific curlcode, forward it */
360 ssize_t Curl_send_plain(struct connectdata *conn, int num,
361 const void *mem, size_t len, CURLcode *code)
363 curl_socket_t sockfd = conn->sock[num];
364 ssize_t bytes_written;
365 /* WinSock will destroy unread received data if send() is
367 To avoid lossage of received data, recv() must be
368 performed before every send() if any incoming data is
370 pre_receive_plain(conn, num);
372 #if defined(MSG_FASTOPEN) && !defined(TCP_FASTOPEN_CONNECT) /* Linux */
373 if(conn->bits.tcp_fastopen) {
374 bytes_written = sendto(sockfd, mem, len, MSG_FASTOPEN,
375 conn->ip_addr->ai_addr, conn->ip_addr->ai_addrlen);
376 conn->bits.tcp_fastopen = FALSE;
380 bytes_written = swrite(sockfd, mem, len);
383 if(-1 == bytes_written) {
387 #ifdef WSAEWOULDBLOCK
388 /* This is how Windows does it */
389 (WSAEWOULDBLOCK == err)
391 /* errno may be EWOULDBLOCK or on some systems EAGAIN when it returned
392 due to its inability to send off data without blocking. We therefore
393 treat both error codes the same here */
394 (EWOULDBLOCK == err) || (EAGAIN == err) || (EINTR == err) ||
398 /* this is just a case of EWOULDBLOCK */
403 failf(conn->data, "Send failure: %s",
404 Curl_strerror(conn, err));
405 conn->data->state.os_errno = err;
406 *code = CURLE_SEND_ERROR;
409 return bytes_written;
413 * Curl_write_plain() is an internal write function that sends data to the
414 * server using plain sockets only. Otherwise meant to have the exact same
415 * proto as Curl_write()
417 CURLcode Curl_write_plain(struct connectdata *conn,
418 curl_socket_t sockfd,
423 ssize_t bytes_written;
425 int num = (sockfd == conn->sock[SECONDARYSOCKET]);
427 bytes_written = Curl_send_plain(conn, num, mem, len, &result);
429 *written = bytes_written;
434 ssize_t Curl_recv_plain(struct connectdata *conn, int num, char *buf,
435 size_t len, CURLcode *code)
437 curl_socket_t sockfd = conn->sock[num];
439 /* Check and return data that already received and storied in internal
440 intermediate buffer */
441 nread = get_pre_recved(conn, num, buf, len);
447 nread = sread(sockfd, buf, len);
454 #ifdef WSAEWOULDBLOCK
455 /* This is how Windows does it */
456 (WSAEWOULDBLOCK == err)
458 /* errno may be EWOULDBLOCK or on some systems EAGAIN when it returned
459 due to its inability to send off data without blocking. We therefore
460 treat both error codes the same here */
461 (EWOULDBLOCK == err) || (EAGAIN == err) || (EINTR == err)
464 /* this is just a case of EWOULDBLOCK */
468 failf(conn->data, "Recv failure: %s",
469 Curl_strerror(conn, err));
470 conn->data->state.os_errno = err;
471 *code = CURLE_RECV_ERROR;
477 static CURLcode pausewrite(struct Curl_easy *data,
478 int type, /* what type of data */
482 /* signalled to pause sending on this connection, but since we have data
483 we want to send we need to dup it to save a copy for when the sending
485 struct SingleRequest *k = &data->req;
486 struct UrlState *s = &data->state;
492 for(i = 0; i< s->tempcount; i++) {
493 if(s->tempwrite[i].type == type) {
494 /* data for this type exists */
505 /* append new data to old data */
507 /* figure out the new size of the data to save */
508 size_t newlen = len + s->tempwrite[i].len;
509 /* allocate the new memory area */
510 char *newptr = realloc(s->tempwrite[i].buf, newlen);
512 return CURLE_OUT_OF_MEMORY;
513 /* copy the new data to the end of the new area */
514 memcpy(newptr + s->tempwrite[i].len, ptr, len);
516 /* update the pointer and the size */
517 s->tempwrite[i].buf = newptr;
518 s->tempwrite[i].len = newlen;
521 dupl = Curl_memdup(ptr, len);
523 return CURLE_OUT_OF_MEMORY;
525 /* store this information in the state struct for later use */
526 s->tempwrite[i].buf = dupl;
527 s->tempwrite[i].len = len;
528 s->tempwrite[i].type = type;
534 /* mark the connection as RECV paused */
535 k->keepon |= KEEP_RECV_PAUSE;
537 DEBUGF(infof(data, "Paused %zu bytes in buffer for type %02x\n",
544 /* chop_write() writes chunks of data not larger than CURL_MAX_WRITE_SIZE via
545 * client write callback(s) and takes care of pause requests from the
548 static CURLcode chop_write(struct connectdata *conn,
553 struct Curl_easy *data = conn->data;
554 curl_write_callback writeheader = NULL;
555 curl_write_callback writebody = NULL;
562 /* If reading is paused, append this data to the already held data for this
564 if(data->req.keepon & KEEP_RECV_PAUSE)
565 return pausewrite(data, type, ptr, len);
567 /* Determine the callback(s) to use. */
568 if(type & CLIENTWRITE_BODY)
569 writebody = data->set.fwrite_func;
570 if((type & CLIENTWRITE_HEADER) &&
571 (data->set.fwrite_header || data->set.writeheader)) {
573 * Write headers to the same callback or to the especially setup
574 * header callback function (added after version 7.7.1).
577 data->set.fwrite_header? data->set.fwrite_header: data->set.fwrite_func;
580 /* Chop data, write chunks. */
582 size_t chunklen = len <= CURL_MAX_WRITE_SIZE? len: CURL_MAX_WRITE_SIZE;
585 size_t wrote = writebody(ptr, 1, chunklen, data->set.out);
587 if(CURL_WRITEFUNC_PAUSE == wrote) {
588 if(conn->handler->flags & PROTOPT_NONETWORK) {
589 /* Protocols that work without network cannot be paused. This is
590 actually only FILE:// just now, and it can't pause since the
591 transfer isn't done using the "normal" procedure. */
592 failf(data, "Write callback asked for PAUSE when not supported!");
593 return CURLE_WRITE_ERROR;
595 return pausewrite(data, type, ptr, len);
597 if(wrote != chunklen) {
598 failf(data, "Failed writing body (%zu != %zu)", wrote, chunklen);
599 return CURLE_WRITE_ERROR;
611 Curl_set_in_callback(data, true);
612 wrote = writeheader(ptr, 1, len, data->set.writeheader);
613 Curl_set_in_callback(data, false);
615 if(CURL_WRITEFUNC_PAUSE == wrote)
616 /* here we pass in the HEADER bit only since if this was body as well
617 then it was passed already and clearly that didn't trigger the
618 pause, so this is saved for later with the HEADER bit only */
619 return pausewrite(data, CLIENTWRITE_HEADER, ptr, len);
622 failf(data, "Failed writing header");
623 return CURLE_WRITE_ERROR;
631 /* Curl_client_write() sends data to the write callback(s)
633 The bit pattern defines to what "streams" to write to. Body and/or header.
634 The defines are in sendf.h of course.
636 If CURL_DO_LINEEND_CONV is enabled, data is converted IN PLACE to the
637 local character encoding. This is a problem and should be changed in
638 the future to leave the original data alone.
640 CURLcode Curl_client_write(struct connectdata *conn,
645 struct Curl_easy *data = conn->data;
650 DEBUGASSERT(type <= 3);
652 /* FTP data may need conversion. */
653 if((type & CLIENTWRITE_BODY) &&
654 (conn->handler->protocol & PROTO_FAMILY_FTP) &&
655 conn->proto.ftpc.transfertype == 'A') {
656 /* convert from the network encoding */
657 CURLcode result = Curl_convert_from_network(data, ptr, len);
658 /* Curl_convert_from_network calls failf if unsuccessful */
662 #ifdef CURL_DO_LINEEND_CONV
663 /* convert end-of-line markers */
664 len = convert_lineends(data, ptr, len);
665 #endif /* CURL_DO_LINEEND_CONV */
668 return chop_write(conn, type, ptr, len);
671 CURLcode Curl_read_plain(curl_socket_t sockfd,
673 size_t bytesfromsocket,
676 ssize_t nread = sread(sockfd, buf, bytesfromsocket);
682 return_error = WSAEWOULDBLOCK == err;
684 return_error = EWOULDBLOCK == err || EAGAIN == err || EINTR == err;
688 return CURLE_RECV_ERROR;
691 /* we only return number of bytes read when we return OK */
697 * Internal read-from-socket function. This is meant to deal with plain
698 * sockets, SSL sockets and kerberos sockets.
700 * Returns a regular CURLcode value.
702 CURLcode Curl_read(struct connectdata *conn, /* connection data */
703 curl_socket_t sockfd, /* read from this socket */
704 char *buf, /* store read data here */
705 size_t sizerequested, /* max amount to read */
706 ssize_t *n) /* amount bytes read */
708 CURLcode result = CURLE_RECV_ERROR;
710 size_t bytesfromsocket = 0;
711 char *buffertofill = NULL;
712 struct Curl_easy *data = conn->data;
714 /* if HTTP/1 pipelining is both wanted and possible */
715 bool pipelining = Curl_pipeline_wanted(data->multi, CURLPIPE_HTTP1) &&
716 (conn->bundle->multiuse == BUNDLE_PIPELINING);
718 /* Set 'num' to 0 or 1, depending on which socket that has been sent here.
719 If it is the second socket, we set num to 1. Otherwise to 0. This lets
720 us use the correct ssl handle. */
721 int num = (sockfd == conn->sock[SECONDARYSOCKET]);
723 *n = 0; /* reset amount to zero */
725 /* If session can pipeline, check connection buffer */
727 size_t bytestocopy = CURLMIN(conn->buf_len - conn->read_pos,
730 /* Copy from our master buffer first if we have some unread data there*/
731 if(bytestocopy > 0) {
732 memcpy(buf, conn->master_buffer + conn->read_pos, bytestocopy);
733 conn->read_pos += bytestocopy;
734 conn->bits.stream_was_rewound = FALSE;
736 *n = (ssize_t)bytestocopy;
739 /* If we come here, it means that there is no data to read from the buffer,
740 * so we read from the socket */
741 bytesfromsocket = CURLMIN(sizerequested, MASTERBUF_SIZE);
742 buffertofill = conn->master_buffer;
745 bytesfromsocket = CURLMIN(sizerequested, (size_t)data->set.buffer_size);
749 nread = conn->recv[num](conn, num, buffertofill, bytesfromsocket, &result);
754 memcpy(buf, conn->master_buffer, nread);
755 conn->buf_len = nread;
756 conn->read_pos = nread;
764 /* return 0 on success */
765 static int showit(struct Curl_easy *data, curl_infotype type,
766 char *ptr, size_t size)
768 static const char s_infotype[CURLINFO_END][3] = {
769 "* ", "< ", "> ", "{ ", "} ", "{ ", "} " };
772 #ifdef CURL_DOES_CONVERSIONS
774 size_t conv_size = 0;
777 case CURLINFO_HEADER_OUT:
778 buf = Curl_memdup(ptr, size);
783 /* Special processing is needed for this block if it
784 * contains both headers and data (separated by CRLFCRLF).
785 * We want to convert just the headers, leaving the data as-is.
789 for(i = 0; i < size-4; i++) {
790 if(memcmp(&buf[i], "\x0d\x0a\x0d\x0a", 4) == 0) {
791 /* convert everything through this CRLFCRLF but no further */
798 Curl_convert_from_network(data, buf, conv_size);
799 /* Curl_convert_from_network calls failf if unsuccessful */
800 /* we might as well continue even if it fails... */
801 ptr = buf; /* switch pointer to use my buffer instead */
804 /* leave everything else as-is */
807 #endif /* CURL_DOES_CONVERSIONS */
809 if(data->set.fdebug) {
810 Curl_set_in_callback(data, true);
811 rc = (*data->set.fdebug)(data, type, ptr, size, data->set.debugdata);
812 Curl_set_in_callback(data, false);
817 case CURLINFO_HEADER_OUT:
818 case CURLINFO_HEADER_IN:
819 fwrite(s_infotype[type], 2, 1, data->set.err);
820 fwrite(ptr, size, 1, data->set.err);
821 #ifdef CURL_DOES_CONVERSIONS
822 if(size != conv_size) {
823 /* we had untranslated data so we need an explicit newline */
824 fwrite("\n", 1, 1, data->set.err);
832 #ifdef CURL_DOES_CONVERSIONS
838 int Curl_debug(struct Curl_easy *data, curl_infotype type,
839 char *ptr, size_t size,
840 struct connectdata *conn)
843 if(data->set.printhost && conn && conn->host.dispname) {
845 const char *t = NULL;
846 const char *w = "Data";
848 case CURLINFO_HEADER_IN:
851 case CURLINFO_DATA_IN:
854 case CURLINFO_HEADER_OUT:
857 case CURLINFO_DATA_OUT:
865 snprintf(buffer, sizeof(buffer), "[%s %s %s]", w, t,
866 conn->host.dispname);
867 rc = showit(data, CURLINFO_TEXT, buffer, strlen(buffer));
872 rc = showit(data, type, ptr, size);