void mime_decode(char *partnum,
char *part_start, size_t length,
char *content_type, char *encoding,
+ char *disposition,
char *name, char *filename,
void (*CallBack)
(char *cbname,
char *cbfilename,
char *cbpartnum,
+ char *cbdisp,
void *cbcontent,
char *cbtype,
size_t cblength)
/* If this part is not encoded, send as-is */
if (strlen(encoding)==0) {
- CallBack(name, filename, partnum, part_start,
+ CallBack(name, filename, partnum, disposition, part_start,
content_type, length);
return;
}
close(recvpipe[0]);
if (!strcasecmp(encoding, "base64"))
execlp("./base64", "base64", "-d", NULL);
- else if (!strcasecmp(encoding, "7bit"))
+ else if (!strcasecmp(encoding, "7bit")) /* just a test */
execlp("/bin/dd", "dd", NULL);
lprintf(5, "ERROR: cannot exec decoder for %s\n", encoding);
exit(1);
lprintf(9, "Decoded length = %d\n", bytes_recv);
if (bytes_recv > 0)
- CallBack(name, filename, partnum, decoded,
+ CallBack(name, filename, partnum, disposition, decoded,
content_type, bytes_recv);
phree(decoded);
}
(char *cbname,
char *cbfilename,
char *cbpartnum,
+ char *cbdisp,
void *cbcontent,
char *cbtype,
size_t cblength)
char endary[256];
char content_type[256];
char encoding[256];
+ char disposition[256];
char name[256];
char filename[256];
int is_multipart;
extract_key(name, content_type, "name");
}
if (!strncasecmp(header, "Content-Disposition: ", 21)) {
- extract_key(filename, header, "filename");
+ strcpy(disposition, &header[21]);
+ extract_key(filename, disposition, "filename");
}
if (!strncasecmp(header,
"Content-transfer-encoding: ", 27))
strcat(header, buf);
} while ((strlen(buf) > 0) && (*ptr != 0));
+ for (i=0; i<strlen(disposition); ++i)
+ if (disposition[i]==';') disposition[i] = 0;
for (i=0; i<strlen(content_type); ++i)
if (content_type[i]==';') content_type[i] = 0;
}
mime_decode(partnum,
part_start, length,
- content_type, encoding,
+ content_type, encoding, disposition,
name, filename, CallBack);
}
(char *cbname,
char *cbfilename,
char *cbpartnum,
+ char *cbdisp,
void *cbcontent,
char *cbtype,
size_t cblength)
/*
*/
-void part_handler(char *name, char *filename, char *partnum,
+void part_handler(char *name, char *filename, char *partnum, char *disp,
void *content, char *cbtype, size_t length) {
- cprintf("part=%s|%s|%s|%s|%d\n",
- name, filename, partnum, cbtype, length);
+ cprintf("part=%s|%s|%s|%s|%s|%d\n",
+ name, filename, partnum, disp, cbtype, length);
}