* Fixed a wrap bug in convert_internet_message()
[citadel.git] / citadel / internet_addressing.c
index ce8337f859bde64855d9ba0799f15937755f9dab..8bfdd6a1c952adf9b36fc650fc83f71e0845e439 100644 (file)
@@ -388,20 +388,29 @@ void unfold_rfc822_field(char **field, char **FieldEnd)
             sField < pFieldEnd; 
             pField++, sField++)
        {
-               if (*pField=='\"') quote = 1 - quote;
-               if (!quote) {
-                       if (isspace(*sField))
-                       {
-                               *pField = ' ';
-                               pField++;
+               if ((*sField=='\r') || (*sField=='\n')) {
+                       while (isspace(*sField))
                                sField++;
-                       
-                               while ((sField < pFieldEnd) && 
-                                      isspace(*sField))
+                       *pField = *sField;
+               }
+               else {
+                       if (*sField=='\"') quote = 1 - quote;
+                       if (!quote) {
+                               if (isspace(*sField))
+                               {
+                                       *pField = ' ';
+                                       pField++;
                                        sField++;
+                                       
+                                       while ((sField < pFieldEnd) && 
+                                              isspace(*sField))
+                                               sField++;
+                                       *pField = *sField;
+                               }
+                               else *pField = *sField;
                        }
+                       else *pField = *sField;
                }
-               else *pField = *sField;
        }
        *pField = '\0';
        *FieldEnd = pField - 1;
@@ -573,8 +582,10 @@ int convert_field(struct CtdlMessage *msg, const char *beg, const char *end) {
        valueend = key + len;
        * ( key + (colonpos - beg) ) = '\0';
        value = &key[(colonpos - beg) + 1];
+/*     printf("Header: [%s]\nValue: [%s]\n", key, value); */
        unfold_rfc822_field(&value, &valueend);
        valuelen = valueend - value + 1;
+/*     printf("UnfoldedValue: [%s]\n", value); */
 
        /*
         * Here's the big rfc822-to-citadel loop.
@@ -768,8 +779,7 @@ struct CtdlMessage *convert_internet_message_buf(StrBuf **rfc822)
                       (done == 0) ) 
                {
 
-                       if ((*pos=='\n') &&
-                           (!isspace(*(pos+1)))) 
+                       if ( (*pos=='\n') && ((*pos+1)!=0x20) && ((*pos+1)!=0x09) )
                        {
                                end = pos;
                        }
@@ -798,6 +808,7 @@ struct CtdlMessage *convert_internet_message_buf(StrBuf **rfc822)
                /* Strip the field out of the RFC822 header if we used it */
                if (!converted) {
                        StrBufAppendBufPlain(OtherHeaders, beg, end - beg, 0);
+                       StrBufAppendBufPlain(OtherHeaders, HKEY("\n"), 0);
                }
 
                /* If we've hit the end of the message, bail out */
@@ -837,7 +848,7 @@ struct CtdlMessage *convert_internet_message_buf(StrBuf **rfc822)
  * The caller is responsible for freeing the returned buffer.  If the requested
  * field is not present, or anything else goes wrong, it returns NULL.
  */
-char *rfc822_fetch_field(char *rfc822, const char *fieldname) {
+char *rfc822_fetch_field(const char *rfc822, const char *fieldname) {
        char *fieldbuf = NULL;
        const char *end_of_headers;
        const char *field_start;
@@ -852,13 +863,13 @@ char *rfc822_fetch_field(char *rfc822, const char *fieldname) {
        snprintf(fieldhdr, sizeof fieldhdr, "%s:", fieldname);
 
        /* Locate the end of the headers, so we don't run past that point */
-       end_of_headers = bmstrcasestr(rfc822, "\n\r\n");
+       end_of_headers = cbmstrcasestr(rfc822, "\n\r\n");
        if (end_of_headers == NULL) {
-               end_of_headers = bmstrcasestr(rfc822, "\n\n");
+               end_of_headers = cbmstrcasestr(rfc822, "\n\n");
        }
        if (end_of_headers == NULL) return (NULL);
 
-       field_start = bmstrcasestr(rfc822, fieldhdr);
+       field_start = cbmstrcasestr(rfc822, fieldhdr);
        if (field_start == NULL) return(NULL);
        if (field_start > end_of_headers) return(NULL);
 
@@ -866,11 +877,11 @@ char *rfc822_fetch_field(char *rfc822, const char *fieldname) {
        strcpy(fieldbuf, "");
 
        ptr = field_start;
-       ptr = memreadline(ptr, fieldbuf, SIZ-strlen(fieldbuf) );
+       ptr = cmemreadline(ptr, fieldbuf, SIZ-strlen(fieldbuf) );
        while ( (isspace(ptr[0])) && (ptr < end_of_headers) ) {
                strcat(fieldbuf, " ");
                cont = &fieldbuf[strlen(fieldbuf)];
-               ptr = memreadline(ptr, cont, SIZ-strlen(fieldbuf) );
+               ptr = cmemreadline(ptr, cont, SIZ-strlen(fieldbuf) );
                striplt(cont);
        }