Gsoap文件传输抓包分析
用网络抓取网络数据包,将数据包内容与实际的cid文件进行对比。
发现Gsaop进行文件传输时,将文件进行转义变换。
转义的内容有:
< | < | 小于号 |
> | > | 大于号 |
& | & | 和 |
' | ' | 单引号 |
" | " | 双引号 |
(详情可参考:http://blog.csdn.net/zlkingdom/article/details/3497637)
可见GSoap和java框架在进行文件传输时,会对文件内容进行转义。
Gsoap源码分析
Gsoap支持特殊字符的自动转义。Gsoap是完全开源的。我们从中截取到了转义的代码:
const char * xstring(const char *s) { size_t n; char *t; const char *r; for (n = 0, r = s; *r; n++, r++) { if (*r < 32 || *r >= 127) n += 4; else if (*r == '<' || *r == '>') n += 3; else if (*r == '&') n += 4; else if (*r == '"') n += 5; else if (*r == '\\') n += 1; } r = t = (char*)emalloc(n + 1); for (; *s; s++) { if (*s < 32 || *s >= 127) { sprintf(t, "&#%.2x;", (unsigned char)*s); t += 5; } else if (*s == '<') { strcpy(t, "<"); t += 4; } else if (*s == '>') { strcpy(t, ">"); t += 4; } else if (*s == '&') { strcpy(t, "&"); t += 5; } else if (*s == '"') { strcpy(t, """); t += 6; } else if (*s == '\\') { strcpy(t, "\\\\"); t += 2; } else *t++ = *s; } *t = '\0'; return r; }
解决方案
建议终端按从Gsaop中截取的代码对文件读取部份进行改造。