diff --git a/libsoup/soup-message-body.c b/libsoup/soup-message-body.c
index 8f1b6a7..1cdb08a 100644
--- a/libsoup/soup-message-body.c
+++ b/libsoup/soup-message-body.c
@@ -349,6 +349,7 @@ typedef struct {
 	GSList *chunks, *last;
 	SoupBuffer *flattened;
 	gboolean accumulate;
+	gboolean resend;
 	goffset base_offset;
 	int ref_count;
 } SoupMessageBodyPrivate;
@@ -368,6 +369,7 @@ soup_message_body_new (void)
 
 	priv = g_slice_new0 (SoupMessageBodyPrivate);
 	priv->accumulate = TRUE;
+	priv->resend = TRUE;
 	priv->ref_count = 1;
 
 	return (SoupMessageBody *)priv;
@@ -747,3 +749,49 @@ soup_message_body_get_type (void)
 	}
 	return type_volatile;
 }
+
+/**
+ * soup_message_body_set_resend_request :
+ * @body: a #SoupMessageBody
+ * @resend: whether or not to resend body chunks in @body
+ *          incase of send request failure.           
+ *
+ * Sets or clears the resend flag on @body. (The default value is
+ * %TRUE.) If set to %FALSE, libsoup assumes that the application takes
+ * care of resending request incase of send failure and libsoup will
+ * not accumulate the request body.
+ *
+ * (If you set the flag to %FALSE on the %request_body of a
+ * client-side message, it will cause the chunks to be
+ * discarded after being written like in the server-side
+ * %response_body case.This can be useful when client sends
+ * large amount of data to network)
+ *
+ * Since: -
+ **/
+void
+soup_message_body_set_resend_request (SoupMessageBody *body,
+				  gboolean		   resend)
+{
+	SoupMessageBodyPrivate *priv = (SoupMessageBodyPrivate *)body;
+	priv->resend = resend;
+}
+
+/**
+ * soup_message_body_get_resend_request:
+ * @body: a #SoupMessageBody
+ *
+ * Gets the resend flag on @body; see
+ * soup_message_body_set_resend_request() for details.
+ *
+ * Return value: the resend flag for @body.
+ *
+ * Since: -
+ **/
+gboolean
+soup_message_body_get_resend_request (SoupMessageBody *body)
+{
+	SoupMessageBodyPrivate *priv = (SoupMessageBodyPrivate *)body;
+
+	return priv->resend;
+}
\ No newline at end of file
diff --git a/libsoup/soup-message-body.h b/libsoup/soup-message-body.h
index 4edaaf0..a16e0ec 100644
--- a/libsoup/soup-message-body.h
+++ b/libsoup/soup-message-body.h
@@ -59,6 +59,10 @@ void             soup_message_body_set_accumulate(SoupMessageBody *body,
 						  gboolean         accumulate);
 gboolean         soup_message_body_get_accumulate(SoupMessageBody *body);
 
+void             soup_message_body_set_resend_request(SoupMessageBody *body,
+                                                  gboolean         resend);
+gboolean         soup_message_body_get_resend_request(SoupMessageBody *body);
+
 void             soup_message_body_append        (SoupMessageBody *body,
 						  SoupMemoryUse    use,
 						  gconstpointer    data,
diff --git a/libsoup/soup-message-io.c b/libsoup/soup-message-io.c
index ee30b41..8e8fc84 100644
--- a/libsoup/soup-message-io.c
+++ b/libsoup/soup-message-io.c
@@ -727,8 +727,10 @@ io_write (SoupSocket *sock, SoupMessage *msg)
 		if (!write_data (msg, io->write_chunk->data,
 				 io->write_chunk->length, TRUE))
 			return;
-
-		if (io->mode == SOUP_MESSAGE_IO_SERVER)
+        /* Don't accumulate request chunks, if app is responsible
+            for resending request*/
+        if((io->mode == SOUP_MESSAGE_IO_SERVER) ||
+            !(soup_message_body_get_resend_request (io->write_body))
 			soup_message_body_wrote_chunk (io->write_body, io->write_chunk);
 		io->write_body_offset += io->write_chunk->length;
 		soup_buffer_free (io->write_chunk);
@@ -771,8 +773,10 @@ io_write (SoupSocket *sock, SoupMessage *msg)
 		if (!write_data (msg, io->write_chunk->data,
 				 io->write_chunk->length, TRUE))
 			return;
-
-		if (io->mode == SOUP_MESSAGE_IO_SERVER)
+        /* Don't accumulate request chunks, if app is responsible
+            for resending request*/
+		if((io->mode == SOUP_MESSAGE_IO_SERVER) ||
+            !(soup_message_body_get_resend_request (io->write_body))
 			soup_message_body_wrote_chunk (io->write_body, io->write_chunk);
 		soup_buffer_free (io->write_chunk);
 		io->write_chunk = NULL;
