diff --git a/src/smblib/smbtxt.c b/src/smblib/smbtxt.c
index 1170ce84d8b7696fae48824dfa58aa97d1598738..a9b4f871d3f66669192b18bb3685503b21f7cdda 100644
--- a/src/smblib/smbtxt.c
+++ b/src/smblib/smbtxt.c
@@ -251,17 +251,26 @@ char* qp_decode(char* buf)
 	return buf;
 }
 
+static size_t strStartsWith_i(const char* buf, const char* match)
+{
+	size_t len = strlen(match);
+	if (strnicmp(buf, match, len) == 0)
+		return len;
+	return 0;
+}
+
 static enum content_transfer_encoding mime_getxferencoding(const char* beg, const char* end)
 {
 	const char* p = beg;
 
 	while(p < end) {
 		SKIP_WHITESPACE(p);
-		if(strnicmp(p, "content-transfer-encoding:", 26) != 0) {
+		size_t len = strStartsWith_i(p, "content-transfer-encoding:");
+		if(len < 1) {
 			FIND_CHAR(p, '\n');
 			continue;
 		}
-		p += 26;
+		p += len;
 		SKIP_WHITESPACE(p);
 		if(strnicmp(p, "base64", 6) == 0)
 			return CONTENT_TRANFER_ENCODING_BASE64;
@@ -283,11 +292,12 @@ static BOOL mime_getattachment(const char* beg, const char* end, char* attachmen
 
 	while(p < end) {
 		SKIP_WHITESPACE(p);
-		if(strnicmp(p, "content-disposition:", 20) != 0) {
+		size_t len = strStartsWith_i(p, "content-disposition:");
+		if(len < 1) {
 			FIND_CHAR(p, '\n');
 			continue;
 		}
-		p += 20;
+		p += len;
 		SKIP_WHITESPACE(p);
 		if(strnicmp(p, "inline", 6) == 0) {
 			FIND_CHAR(p, '\n');
@@ -338,8 +348,9 @@ void SMBCALL smb_parse_content_type(const char* content_type, char** subtype, ch
 	char* p;
 	if((p = strstr(buf, "\r\n\r\n")) != NULL)	/* Don't parse past the end of header */
 		*p = 0;
-	if((p = strstr(buf, "text/")) == buf) {
-		p += 5;
+	size_t len = strStartsWith_i(buf, "text/");
+	if(len > 0) {
+		p = buf + len;
 		if(subtype != NULL) {
 			if((*subtype = strdup(p)) != NULL) {
 				char* tp = *subtype;
@@ -350,7 +361,7 @@ void SMBCALL smb_parse_content_type(const char* content_type, char** subtype, ch
 				*tp = 0;
 			}
 		}
-		if(charset != NULL && (p = strstr(p, "charset=")) != NULL) {
+		if(charset != NULL && (p = strcasestr(p, "charset=")) != NULL) {
 			p += 8;
 			if(*p == '"')
 				p++;
@@ -365,7 +376,7 @@ void SMBCALL smb_parse_content_type(const char* content_type, char** subtype, ch
 	}
 }
 
-/* Find the specified content-type in a MIME-encoded message body, recursively */
+/* Find the specified content-type in a multi-pat MIME-encoded message body, recursively */
 static const char* mime_getcontent(const char* buf, const char* content_type, const char* content_match
 	,int depth, enum content_transfer_encoding* encoding, char** charset, char* attachment, size_t attachment_len, int index)
 {
@@ -386,15 +397,14 @@ static const char* mime_getcontent(const char* buf, const char* content_type, co
 		return NULL;
 	if(content_type == NULL)	/* Not MIME-encoded */
 		return NULL;
-	if(strstr(content_type, "multipart/alternative;") == content_type)
-		content_type += 22;
-	else if(strstr(content_type, "multipart/mixed;") == content_type)
-		content_type +=16;
-	else if(strstr(content_type, "multipart/report;") == content_type)
-		content_type +=17;
-	else
+	size_t len;
+	if(((len = strStartsWith_i(content_type, "multipart/alternative;")) < 1)
+	&& ((len = strStartsWith_i(content_type, "multipart/mixed;")) < 1)
+	&& ((len = strStartsWith_i(content_type, "multipart/report;")) < 1)
+	&& ((len = strStartsWith_i(content_type, "multipart/")) < 1))
 		return NULL;
-	p = strstr(content_type, "boundary=");
+	content_type += len;
+	p = strcasestr(content_type, "boundary=");
 	if(p == NULL)
 		return NULL;
 	p += 9;
@@ -414,8 +424,8 @@ static const char* mime_getcontent(const char* buf, const char* content_type, co
 			continue;
 		for(content_type = txt; content_type < p; content_type++) {
 			SKIP_WHITESPACE(content_type);
-			if(strnicmp(content_type, "Content-Type:", 13) == 0) {
-				content_type += 13;
+			if((len = strStartsWith_i(content_type, "Content-Type:")) > 0) {
+				content_type += len;
 				SKIP_WHITESPACE(content_type);
 				break;
 			}