代码改变世界

RHTTPHeaders有bug,使用须谨慎

2011-04-01 11:52  大马哈鱼1985  阅读(375)  评论(0编辑  收藏  举报

重构http引擎时,想要dump出所有的http response头域,结果在Set-Cookie上栽了跟头。

现象很诡异,有时候RHTTPHeaders::GetRawField()拿Set-Cookie头的值时,内容居然是“Cookie”,这叫什么活啊?

遇到这问题的不是哥一个,还有其他的一些倒霉蛋,FN Nokia有帖子为证,地址不附了,自己Google。

注意,我说的是有时候,也就是说,也有时候是正常的,内容比如为“JSESSIONID=XXXXXXXXX; path=/”

经过俺的努力调研,公布如下调查结果:

1.老老实实使用RHTTPHeaders::GetParam()常规手段拿Set-Cookie,这个是不会出错的,不过写出来的代码稍显猥琐,还很冗长,没办法,这也是狗日的Symbian代码的特色之一了。

2.实在跟哥一样喜欢偷懒想使用RHTTPHeaders::GetRawField()的话,千万记住,不要在Set-Cookie上将RHTTPHeaders::GetRawField()跟RHTTPHeaders::GetParam()混起来使用。你可以做如下测试:

  1)用RHTTPHeaders::GetParam()正常拿Cookie,成功。
  2)用RHTTPHeaders::GetRawField()拿Cookie原始数据。你会发现拿到的数据内容是“Cookie”。
  3)再次用RHTTPHeaders::GetParam()拿Cookie,这时会导致http自己发生panic(但是不会导致你的程序崩掉,狗血吧!)。

3.RHTTPHeaders不支持重复头域。也就是说,假如你拿到一个response,头域中有多个Set-Cookie头(貌似这是符合http规范的),RHTTPHeaders只让你拿到第一个,后续的你是拿不到的。那有没有其他途径能拿到?答案是没门。

结论:
  1)symbian实在操蛋
  2)除了Set-Cookie头会有这样的情况,其他http标准头是否也有此情况?暂未测试,不过结果应该也是悲观的。