From f8aa88945cb98d45c021dfff5aaad4199f8ce299 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Sat, 14 Nov 2009 00:13:44 +0000
Subject: [PATCH] Add partial FETCH for BODY[]

---
 exec/imapservice.js | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/exec/imapservice.js b/exec/imapservice.js
index 5309f9e89f..467293a585 100644
--- a/exec/imapservice.js
+++ b/exec/imapservice.js
@@ -364,12 +364,25 @@ function send_fetch_response(msgnum, fmat, uid)
 		}
 		if(fmat[i].toUpperCase().substr(0,4)=='BODY') {
 			function get_mime_part(fmat) {
-				var m=fmat.match(/^BODY((?:\.PEEK)?)\[([^[\]]*)/i);
+				var m=fmat.match(/^BODY((?:\.PEEK)?)\[([^[\]]*)(?:\]\<([0-9]+)\.([0-9]+)\>)?/i);
 				var specifiers;
 				var i;
 				var tmp;
 				var part_name='';
 
+				function encode_binary_part(start, len, str)
+				{
+					if(start==undefined || start=='')
+						start=0;
+					else
+						start=parseInt(start,10);
+					if(len==undefined || len=='')
+						len=str.length;
+					else
+						len=parseInt(len,10);
+					return(encode_binary(str.substr(start,len)));
+				}
+
 				part=mime;
 				if(m==null)
 					return(undefined);
@@ -387,6 +400,8 @@ function send_fetch_response(msgnum, fmat, uid)
 					else
 						break;
 				}
+				if(m[3]!=undefined && m[3]!='')
+					part_name += '<'+m[3]+'>';
 				switch(specifiers[i]) {
 					case 'HEADER':
 						if(specifiers[i+1]!=undefined) {
@@ -394,16 +409,16 @@ function send_fetch_response(msgnum, fmat, uid)
 							return undefined;
 						}
 						else
-							return(part_name+" "+encode_binary(part.headers['::'].join('')+"\r\n")+' ');
+							return(part_name+" "+encode_binary_part(m[3],m[4],part.headers['::'].join('')+"\r\n")+' ');
 					case 'MIME':
-						return(part_name+" "+encode_binary(part.headers[':mime:'].join('')+"\r\n")+' ');
+						return(part_name+" "+encode_binary_part(m[3],m[4],part.headers[':mime:'].join('')+"\r\n")+' ');
 					case '':
 						if(specifiers.length==1)
-							return(part_name+" "+encode_binary(part.headers['::'].join('')+'\r\n'+part.text)+' ');
+							return(part_name+" "+encode_binary_part(m[3],m[4],part.headers['::'].join('')+'\r\n'+part.text)+' ');
 						// Fall-through
 					case undefined:
 					case 'TEXT':
-						return(part_name+' '+encode_binary(part.text)+' ');
+						return(part_name+' '+encode_binary_part(m[3],m[4],part.text)+' ');
 				}
 			}
 
-- 
GitLab