return CURLE_RECV_ERROR;
}
+ /* This 'OK' line ends with a CR LF pair which is the two first bytes of the
+ EOB string so count this is two matching bytes. This is necessary to make
+ the code detect the EOB if the only data than comes now is %2e CR LF like
+ when there is no body to return. */
+ pop3c->eob = 2;
+
+ /* But since this initial CR LF pair is not part of the actual body, we set
+ the strip counter here so that these bytes won't be delivered. */
+ pop3c->strip = 2;
+
/* POP3 download */
Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, pop3->bytecountp,
-1, NULL); /* no upload here */
return CURLE_OK;
}
else if(prev && (prev >= pop3c->eob)) {
- /* write out the body part that didn't match */
- result = Curl_client_write(conn, CLIENTWRITE_BODY, (char*)POP3_EOB,
- prev);
- if(result)
- return result;
+
+ /* strip can only be non-zero for the very first mismatch after CRLF and
+ then both prev and strip are equal and nothing will be output
+ below */
+ while(prev && pop3c->strip) {
+ prev--;
+ pop3c->strip--;
+ }
+
+ if(prev) {
+ /* write out the body part that didn't match */
+ result = Curl_client_write(conn, CLIENTWRITE_BODY, (char*)POP3_EOB,
+ prev);
+ if(result)
+ return result;
+ }
}
}
/* while EOB is matching, don't output it! */
return CURLE_OK;
- result = Curl_client_write(conn, CLIENTWRITE_BODY, str, nread);
+ while(nread && pop3c->strip) {
+ nread--;
+ pop3c->strip--;
+ str++;
+ }
+
+ if(nread) {
+ result = Curl_client_write(conn, CLIENTWRITE_BODY, str, nread);
+ }
return result;
}
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
char *mailbox; /* what to RETR */
size_t eob; /* number of bytes of the EOB (End Of Body) that has been
received thus far */
+ size_t strip; /* number of bytes from the start to ignore as non-body */
pop3state state; /* always use pop3.c:state() to change state! */
};