从CFHTTPMessageRef获取原始HTTP请求

时间:2008-12-08 04:55:05

标签: iphone networking core-foundation

我正在使用CFHTTPMessage的包装器类,其中包含一个CFHTTPMessageRef对象,其中添加了方法(GET),Web应用程序服务器的URL以及一些包含的自定义标头日期和身份验证随机数。

我在获取方法和URL以返回某些数据时遇到了一些问题。我想我已经制定了身份验证随机数。

我想通过查看发送到Web应用程序的原始请求并确保所有内容都已正确格式化来解决此问题。

我的问题是:如果我有一个CFHTTPMessageRef对象(例如messageRef),是否有办法记录此消息中出现的原始HTTP请求?

我尝试过以下操作但在尝试访问其字节时收到EXC_BAD_ACCESS信号:

CFDataRef messageData = CFHTTPMessageCopyBody(messageRef);

感谢您的任何建议。

作为替代方案,是否可以在交换网络上使用数据包嗅探器?我可以在笔记本电脑设备上运行ettercap,但不知道如何嗅探我的iPhone在本地无线网络上的行为。

2 个答案:

答案 0 :(得分:9)

以下效果很好:

NSData *d = (NSData *)CFHTTPMessageCopySerializedMessage(messageRef);
NSLog(@"%@",[[[NSString alloc] initWithBytes:[d bytes] length:[d length] encoding:NSUTF8StringEncoding] autorelease]);

希望这对其他人有帮助。

答案 1 :(得分:0)

访问字节时应该获得EXC_BAD_ACCESS的唯一原因是messageData为NULL(没有HTTP正文)并且您正在取消引用它。

要记住:HTTP正文不是“原始请求”。它不包括标头或实际的HTTP指令(GET / POST / ETC)。如果你实际上没有设定身体内容,那就是零。

可能(但不太可能)您的CFHTTPMessageRef值未正确初始化。通过在CFHTTPMessageCopyBody行上设置断点,进入Debugger Console窗口,将文本输入光标设置到此窗口的最后一行并输入“po messageRef”,在调试器中进行检查。如果有效初始化,它应该给你一个CFTypeID消息。