【原创】基于GSoap上Webservice服务GetFile获取文件不完整的调查

Gsoap文件传输抓包分析

用网络抓取网络数据包,将数据包内容与实际的cid文件进行对比。

发现Gsaop进行文件传输时,将文件进行转义变换。

image

转义的内容有:

<

<

小于号

&gt;

>

大于号

&amp;

&

&apos;

'

单引号

&quot;

"

双引号

(详情可参考: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, "&lt;");

t += 4;

}

else if (*s == '>')

{ strcpy(t, "&gt;");

t += 4;

}

else if (*s == '&')

{ strcpy(t, "&amp;");

t += 5;

}

else if (*s == '"')

{ strcpy(t, "&quot;");

t += 6;

}

else if (*s == '\\')

{ strcpy(t, "\\\\");

t += 2;

}

else

*t++ = *s;

}

*t = '\0';

return r;

}

 

解决方案

建议终端按从Gsaop中截取的代码对文件读取部份进行改造。

posted @ 2016-04-13 09:50  xiaoleisme  阅读(804)  评论(0编辑  收藏  举报