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>
35 #ifdef USE_TIZEN_FEATURE_DLP
36 #include "extensions/curl_extensions.h"
41 #include "vtls/vtls.h"
45 #include "non-ascii.h"
50 /* The last 3 #include files should be in this order */
51 #include "curl_printf.h"
52 #include "curl_memory.h"
55 #ifdef CURL_DO_LINEEND_CONV
57 * convert_lineends() changes CRLF (\r\n) end-of-line markers to a single LF
58 * (\n), with special processing for CRLF sequences that are split between two
59 * blocks of data. Remaining, bare CRs are changed to LFs. The possibly new
60 * size of the data is returned.
62 static size_t convert_lineends(struct Curl_easy *data,
63 char *startPtr, size_t size)
68 if((startPtr == NULL) || (size < 1)) {
72 if(data->state.prev_block_had_trailing_cr) {
73 /* The previous block of incoming data
74 had a trailing CR, which was turned into a LF. */
75 if(*startPtr == '\n') {
76 /* This block of incoming data starts with the
77 previous block's LF so get rid of it */
78 memmove(startPtr, startPtr + 1, size-1);
80 /* and it wasn't a bare CR but a CRLF conversion instead */
81 data->state.crlf_conversions++;
83 data->state.prev_block_had_trailing_cr = FALSE; /* reset the flag */
86 /* find 1st CR, if any */
87 inPtr = outPtr = memchr(startPtr, '\r', size);
89 /* at least one CR, now look for CRLF */
90 while(inPtr < (startPtr + size-1)) {
91 /* note that it's size-1, so we'll never look past the last byte */
92 if(memcmp(inPtr, "\r\n", 2) == 0) {
93 /* CRLF found, bump past the CR and copy the NL */
96 /* keep track of how many CRLFs we converted */
97 data->state.crlf_conversions++;
101 /* lone CR, move LF instead */
105 /* not a CRLF nor a CR, just copy whatever it is */
111 } /* end of while loop */
113 if(inPtr < startPtr + size) {
114 /* handle last byte */
116 /* deal with a CR at the end of the buffer */
117 *outPtr = '\n'; /* copy a NL instead */
118 /* note that a CRLF might be split across two blocks */
119 data->state.prev_block_had_trailing_cr = TRUE;
127 if(outPtr < startPtr + size)
128 /* tidy up by null terminating the now shorter data */
131 return (outPtr - startPtr);
135 #endif /* CURL_DO_LINEEND_CONV */
137 #ifdef USE_RECV_BEFORE_SEND_WORKAROUND
138 bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex)
140 struct postponed_data * const psnd = &(conn->postponed[sockindex]);
141 return psnd->buffer && psnd->allocated_size &&
142 psnd->recv_size > psnd->recv_processed;
145 static void pre_receive_plain(struct connectdata *conn, int num)
147 const curl_socket_t sockfd = conn->sock[num];
148 struct postponed_data * const psnd = &(conn->postponed[num]);
149 size_t bytestorecv = psnd->allocated_size - psnd->recv_size;
150 /* WinSock will destroy unread received data if send() is
152 To avoid lossage of received data, recv() must be
153 performed before every send() if any incoming data is
154 available. However, skip this, if buffer is already full. */
155 if((conn->handler->protocol&PROTO_FAMILY_HTTP) != 0 &&
156 conn->recv[num] == Curl_recv_plain &&
157 (!psnd->buffer || bytestorecv)) {
158 const int readymask = Curl_socket_check(sockfd, CURL_SOCKET_BAD,
160 if(readymask != -1 && (readymask & CURL_CSELECT_IN) != 0) {
161 /* Have some incoming data */
163 /* Use buffer double default size for intermediate buffer */
164 psnd->allocated_size = 2 * conn->data->set.buffer_size;
165 psnd->buffer = malloc(psnd->allocated_size);
167 psnd->recv_processed = 0;
169 psnd->bindsock = sockfd; /* Used only for DEBUGASSERT */
170 #endif /* DEBUGBUILD */
171 bytestorecv = psnd->allocated_size;
175 DEBUGASSERT(psnd->bindsock == sockfd);
176 recvedbytes = sread(sockfd, psnd->buffer + psnd->recv_size,
179 psnd->recv_size += recvedbytes;
182 psnd->allocated_size = 0;
187 static ssize_t get_pre_recved(struct connectdata *conn, int num, char *buf,
190 struct postponed_data * const psnd = &(conn->postponed[num]);
195 DEBUGASSERT(psnd->allocated_size > 0);
196 DEBUGASSERT(psnd->recv_size <= psnd->allocated_size);
197 DEBUGASSERT(psnd->recv_processed <= psnd->recv_size);
198 /* Check and process data that already received and storied in internal
199 intermediate buffer */
200 if(psnd->recv_size > psnd->recv_processed) {
201 DEBUGASSERT(psnd->bindsock == conn->sock[num]);
202 copysize = CURLMIN(len, psnd->recv_size - psnd->recv_processed);
203 memcpy(buf, psnd->buffer + psnd->recv_processed, copysize);
204 psnd->recv_processed += copysize;
207 copysize = 0; /* buffer was allocated, but nothing was received */
209 /* Free intermediate buffer if it has no unprocessed data */
210 if(psnd->recv_processed == psnd->recv_size) {
213 psnd->allocated_size = 0;
215 psnd->recv_processed = 0;
217 psnd->bindsock = CURL_SOCKET_BAD;
218 #endif /* DEBUGBUILD */
220 return (ssize_t)copysize;
222 #else /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
223 /* Use "do-nothing" macros instead of functions when workaround not used */
224 bool Curl_recv_has_postponed_data(struct connectdata *conn, int sockindex)
230 #define pre_receive_plain(c,n) do {} WHILE_FALSE
231 #define get_pre_recved(c,n,b,l) 0
232 #endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
234 /* Curl_infof() is for info message along the way */
236 void Curl_infof(struct Curl_easy *data, const char *fmt, ...)
238 if(data && data->set.verbose) {
241 char print_buffer[2048 + 1];
243 vsnprintf(print_buffer, sizeof(print_buffer), fmt, ap);
245 len = strlen(print_buffer);
246 Curl_debug(data, CURLINFO_TEXT, print_buffer, len, NULL);
250 /* Curl_failf() is for messages stating why we failed.
251 * The message SHALL NOT include any LF or CR.
254 void Curl_failf(struct Curl_easy *data, const char *fmt, ...)
256 if(data->set.verbose || data->set.errorbuffer) {
259 char error[CURL_ERROR_SIZE + 2];
261 vsnprintf(error, CURL_ERROR_SIZE, fmt, ap);
264 if(data->set.errorbuffer && !data->state.errorbuf) {
265 strcpy(data->set.errorbuffer, error);
266 data->state.errorbuf = TRUE; /* wrote error string */
268 if(data->set.verbose) {
271 Curl_debug(data, CURLINFO_TEXT, error, len, NULL);
277 /* Curl_sendf() sends formatted data to the server */
278 CURLcode Curl_sendf(curl_socket_t sockfd, struct connectdata *conn,
279 const char *fmt, ...)
281 struct Curl_easy *data = conn->data;
282 ssize_t bytes_written;
284 CURLcode result = CURLE_OK;
289 s = vaprintf(fmt, ap); /* returns an allocated string */
292 return CURLE_OUT_OF_MEMORY; /* failure */
295 write_len = strlen(s);
299 /* Write the buffer to the socket */
300 result = Curl_write(conn, sockfd, sptr, write_len, &bytes_written);
305 if(data->set.verbose)
306 Curl_debug(data, CURLINFO_DATA_OUT, sptr, (size_t)bytes_written, conn);
308 if((size_t)bytes_written != write_len) {
309 /* if not all was written at once, we must advance the pointer, decrease
310 the size left and try again! */
311 write_len -= bytes_written;
312 sptr += bytes_written;
318 free(s); /* free the output string */
324 * Curl_write() is an internal write function that sends data to the
325 * server. Works with plain sockets, SCP, SSL or kerberos.
327 * If the write would block (CURLE_AGAIN), we return CURLE_OK and
328 * (*written == 0). Otherwise we return regular CURLcode value.
330 CURLcode Curl_write(struct connectdata *conn,
331 curl_socket_t sockfd,
336 ssize_t bytes_written;
337 CURLcode result = CURLE_OK;
338 int num = (sockfd == conn->sock[SECONDARYSOCKET]);
340 #ifdef USE_TIZEN_FEATURE_DLP
342 * Send data to Tizen DLP verification
344 curl_extensions_tizen_dlp_check_leak(conn->host.dispname, (char *const)mem,
348 bytes_written = conn->send[num](conn, num, mem, len, &result);
350 *written = bytes_written;
351 if(bytes_written >= 0)
352 /* we completely ignore the curlcode value when subzero is not returned */
355 /* handle CURLE_AGAIN or a send failure */
362 /* general send failure */
363 return CURLE_SEND_ERROR;
366 /* we got a specific curlcode, forward it */
371 ssize_t Curl_send_plain(struct connectdata *conn, int num,
372 const void *mem, size_t len, CURLcode *code)
374 curl_socket_t sockfd = conn->sock[num];
375 ssize_t bytes_written;
376 /* WinSock will destroy unread received data if send() is
378 To avoid lossage of received data, recv() must be
379 performed before every send() if any incoming data is
381 pre_receive_plain(conn, num);
383 #if defined(MSG_FASTOPEN) && !defined(TCP_FASTOPEN_CONNECT) /* Linux */
384 if(conn->bits.tcp_fastopen) {
385 bytes_written = sendto(sockfd, mem, len, MSG_FASTOPEN,
386 conn->ip_addr->ai_addr, conn->ip_addr->ai_addrlen);
387 conn->bits.tcp_fastopen = FALSE;
391 bytes_written = swrite(sockfd, mem, len);
394 if(-1 == bytes_written) {
398 #ifdef WSAEWOULDBLOCK
399 /* This is how Windows does it */
400 (WSAEWOULDBLOCK == err)
402 /* errno may be EWOULDBLOCK or on some systems EAGAIN when it returned
403 due to its inability to send off data without blocking. We therefore
404 treat both error codes the same here */
405 (EWOULDBLOCK == err) || (EAGAIN == err) || (EINTR == err) ||
409 /* this is just a case of EWOULDBLOCK */
414 failf(conn->data, "Send failure: %s",
415 Curl_strerror(conn, err));
416 conn->data->state.os_errno = err;
417 *code = CURLE_SEND_ERROR;
420 return bytes_written;
424 * Curl_write_plain() is an internal write function that sends data to the
425 * server using plain sockets only. Otherwise meant to have the exact same
426 * proto as Curl_write()
428 CURLcode Curl_write_plain(struct connectdata *conn,
429 curl_socket_t sockfd,
434 ssize_t bytes_written;
436 int num = (sockfd == conn->sock[SECONDARYSOCKET]);
438 bytes_written = Curl_send_plain(conn, num, mem, len, &result);
440 *written = bytes_written;
445 ssize_t Curl_recv_plain(struct connectdata *conn, int num, char *buf,
446 size_t len, CURLcode *code)
448 curl_socket_t sockfd = conn->sock[num];
450 /* Check and return data that already received and storied in internal
451 intermediate buffer */
452 nread = get_pre_recved(conn, num, buf, len);
458 nread = sread(sockfd, buf, len);
465 #ifdef WSAEWOULDBLOCK
466 /* This is how Windows does it */
467 (WSAEWOULDBLOCK == err)
469 /* errno may be EWOULDBLOCK or on some systems EAGAIN when it returned
470 due to its inability to send off data without blocking. We therefore
471 treat both error codes the same here */
472 (EWOULDBLOCK == err) || (EAGAIN == err) || (EINTR == err)
475 /* this is just a case of EWOULDBLOCK */
479 failf(conn->data, "Recv failure: %s",
480 Curl_strerror(conn, err));
481 conn->data->state.os_errno = err;
482 *code = CURLE_RECV_ERROR;
488 static CURLcode pausewrite(struct Curl_easy *data,
489 int type, /* what type of data */
493 /* signalled to pause sending on this connection, but since we have data
494 we want to send we need to dup it to save a copy for when the sending
496 struct SingleRequest *k = &data->req;
497 struct UrlState *s = &data->state;
503 for(i = 0; i< s->tempcount; i++) {
504 if(s->tempwrite[i].type == type) {
505 /* data for this type exists */
516 /* append new data to old data */
518 /* figure out the new size of the data to save */
519 size_t newlen = len + s->tempwrite[i].len;
520 /* allocate the new memory area */
521 char *newptr = realloc(s->tempwrite[i].buf, newlen);
523 return CURLE_OUT_OF_MEMORY;
524 /* copy the new data to the end of the new area */
525 memcpy(newptr + s->tempwrite[i].len, ptr, len);
527 /* update the pointer and the size */
528 s->tempwrite[i].buf = newptr;
529 s->tempwrite[i].len = newlen;
532 dupl = Curl_memdup(ptr, len);
534 return CURLE_OUT_OF_MEMORY;
536 /* store this information in the state struct for later use */
537 s->tempwrite[i].buf = dupl;
538 s->tempwrite[i].len = len;
539 s->tempwrite[i].type = type;
545 /* mark the connection as RECV paused */
546 k->keepon |= KEEP_RECV_PAUSE;
548 DEBUGF(infof(data, "Paused %zu bytes in buffer for type %02x\n",
555 /* chop_write() writes chunks of data not larger than CURL_MAX_WRITE_SIZE via
556 * client write callback(s) and takes care of pause requests from the
559 static CURLcode chop_write(struct connectdata *conn,
564 struct Curl_easy *data = conn->data;
565 curl_write_callback writeheader = NULL;
566 curl_write_callback writebody = NULL;
573 /* If reading is paused, append this data to the already held data for this
575 if(data->req.keepon & KEEP_RECV_PAUSE)
576 return pausewrite(data, type, ptr, len);
578 /* Determine the callback(s) to use. */
579 if(type & CLIENTWRITE_BODY)
580 writebody = data->set.fwrite_func;
581 if((type & CLIENTWRITE_HEADER) &&
582 (data->set.fwrite_header || data->set.writeheader)) {
584 * Write headers to the same callback or to the especially setup
585 * header callback function (added after version 7.7.1).
588 data->set.fwrite_header? data->set.fwrite_header: data->set.fwrite_func;
591 /* Chop data, write chunks. */
593 size_t chunklen = len <= CURL_MAX_WRITE_SIZE? len: CURL_MAX_WRITE_SIZE;
596 size_t wrote = writebody(ptr, 1, chunklen, data->set.out);
598 if(CURL_WRITEFUNC_PAUSE == wrote) {
599 if(conn->handler->flags & PROTOPT_NONETWORK) {
600 /* Protocols that work without network cannot be paused. This is
601 actually only FILE:// just now, and it can't pause since the
602 transfer isn't done using the "normal" procedure. */
603 failf(data, "Write callback asked for PAUSE when not supported!");
604 return CURLE_WRITE_ERROR;
606 return pausewrite(data, type, ptr, len);
608 if(wrote != chunklen) {
609 failf(data, "Failed writing body (%zu != %zu)", wrote, chunklen);
610 return CURLE_WRITE_ERROR;
622 Curl_set_in_callback(data, true);
623 wrote = writeheader(ptr, 1, len, data->set.writeheader);
624 Curl_set_in_callback(data, false);
626 if(CURL_WRITEFUNC_PAUSE == wrote)
627 /* here we pass in the HEADER bit only since if this was body as well
628 then it was passed already and clearly that didn't trigger the
629 pause, so this is saved for later with the HEADER bit only */
630 return pausewrite(data, CLIENTWRITE_HEADER, ptr, len);
633 failf(data, "Failed writing header");
634 return CURLE_WRITE_ERROR;
642 /* Curl_client_write() sends data to the write callback(s)
644 The bit pattern defines to what "streams" to write to. Body and/or header.
645 The defines are in sendf.h of course.
647 If CURL_DO_LINEEND_CONV is enabled, data is converted IN PLACE to the
648 local character encoding. This is a problem and should be changed in
649 the future to leave the original data alone.
651 CURLcode Curl_client_write(struct connectdata *conn,
656 struct Curl_easy *data = conn->data;
661 DEBUGASSERT(type <= 3);
663 /* FTP data may need conversion. */
664 if((type & CLIENTWRITE_BODY) &&
665 (conn->handler->protocol & PROTO_FAMILY_FTP) &&
666 conn->proto.ftpc.transfertype == 'A') {
667 /* convert from the network encoding */
668 CURLcode result = Curl_convert_from_network(data, ptr, len);
669 /* Curl_convert_from_network calls failf if unsuccessful */
673 #ifdef CURL_DO_LINEEND_CONV
674 /* convert end-of-line markers */
675 len = convert_lineends(data, ptr, len);
676 #endif /* CURL_DO_LINEEND_CONV */
679 return chop_write(conn, type, ptr, len);
682 CURLcode Curl_read_plain(curl_socket_t sockfd,
684 size_t bytesfromsocket,
687 ssize_t nread = sread(sockfd, buf, bytesfromsocket);
693 return_error = WSAEWOULDBLOCK == err;
695 return_error = EWOULDBLOCK == err || EAGAIN == err || EINTR == err;
699 return CURLE_RECV_ERROR;
702 /* we only return number of bytes read when we return OK */
708 * Internal read-from-socket function. This is meant to deal with plain
709 * sockets, SSL sockets and kerberos sockets.
711 * Returns a regular CURLcode value.
713 CURLcode Curl_read(struct connectdata *conn, /* connection data */
714 curl_socket_t sockfd, /* read from this socket */
715 char *buf, /* store read data here */
716 size_t sizerequested, /* max amount to read */
717 ssize_t *n) /* amount bytes read */
719 CURLcode result = CURLE_RECV_ERROR;
721 size_t bytesfromsocket = 0;
722 char *buffertofill = NULL;
723 struct Curl_easy *data = conn->data;
725 /* if HTTP/1 pipelining is both wanted and possible */
726 bool pipelining = Curl_pipeline_wanted(data->multi, CURLPIPE_HTTP1) &&
727 (conn->bundle->multiuse == BUNDLE_PIPELINING);
729 /* Set 'num' to 0 or 1, depending on which socket that has been sent here.
730 If it is the second socket, we set num to 1. Otherwise to 0. This lets
731 us use the correct ssl handle. */
732 int num = (sockfd == conn->sock[SECONDARYSOCKET]);
734 *n = 0; /* reset amount to zero */
736 /* If session can pipeline, check connection buffer */
738 size_t bytestocopy = CURLMIN(conn->buf_len - conn->read_pos,
741 /* Copy from our master buffer first if we have some unread data there*/
742 if(bytestocopy > 0) {
743 memcpy(buf, conn->master_buffer + conn->read_pos, bytestocopy);
744 conn->read_pos += bytestocopy;
745 conn->bits.stream_was_rewound = FALSE;
747 *n = (ssize_t)bytestocopy;
750 /* If we come here, it means that there is no data to read from the buffer,
751 * so we read from the socket */
752 bytesfromsocket = CURLMIN(sizerequested, MASTERBUF_SIZE);
753 buffertofill = conn->master_buffer;
756 bytesfromsocket = CURLMIN(sizerequested, (size_t)data->set.buffer_size);
760 nread = conn->recv[num](conn, num, buffertofill, bytesfromsocket, &result);
765 memcpy(buf, conn->master_buffer, nread);
766 conn->buf_len = nread;
767 conn->read_pos = nread;
775 /* return 0 on success */
776 static int showit(struct Curl_easy *data, curl_infotype type,
777 char *ptr, size_t size)
779 static const char s_infotype[CURLINFO_END][3] = {
780 "* ", "< ", "> ", "{ ", "} ", "{ ", "} " };
783 #ifdef CURL_DOES_CONVERSIONS
785 size_t conv_size = 0;
788 case CURLINFO_HEADER_OUT:
789 buf = Curl_memdup(ptr, size);
794 /* Special processing is needed for this block if it
795 * contains both headers and data (separated by CRLFCRLF).
796 * We want to convert just the headers, leaving the data as-is.
800 for(i = 0; i < size-4; i++) {
801 if(memcmp(&buf[i], "\x0d\x0a\x0d\x0a", 4) == 0) {
802 /* convert everything through this CRLFCRLF but no further */
809 Curl_convert_from_network(data, buf, conv_size);
810 /* Curl_convert_from_network calls failf if unsuccessful */
811 /* we might as well continue even if it fails... */
812 ptr = buf; /* switch pointer to use my buffer instead */
815 /* leave everything else as-is */
818 #endif /* CURL_DOES_CONVERSIONS */
820 if(data->set.fdebug) {
821 Curl_set_in_callback(data, true);
822 rc = (*data->set.fdebug)(data, type, ptr, size, data->set.debugdata);
823 Curl_set_in_callback(data, false);
828 case CURLINFO_HEADER_OUT:
829 case CURLINFO_HEADER_IN:
830 fwrite(s_infotype[type], 2, 1, data->set.err);
831 fwrite(ptr, size, 1, data->set.err);
832 #ifdef CURL_DOES_CONVERSIONS
833 if(size != conv_size) {
834 /* we had untranslated data so we need an explicit newline */
835 fwrite("\n", 1, 1, data->set.err);
843 #ifdef CURL_DOES_CONVERSIONS
849 int Curl_debug(struct Curl_easy *data, curl_infotype type,
850 char *ptr, size_t size,
851 struct connectdata *conn)
854 if(data->set.printhost && conn && conn->host.dispname) {
856 const char *t = NULL;
857 const char *w = "Data";
859 case CURLINFO_HEADER_IN:
862 case CURLINFO_DATA_IN:
865 case CURLINFO_HEADER_OUT:
868 case CURLINFO_DATA_OUT:
876 snprintf(buffer, sizeof(buffer), "[%s %s %s]", w, t,
877 conn->host.dispname);
878 rc = showit(data, CURLINFO_TEXT, buffer, strlen(buffer));
883 rc = showit(data, type, ptr, size);