由于这个非RFC头字段不在HTTP_Env和http_t struct中,我写了这段代码:
//Get reply buffer
xbuf_t *reply = get_reply(argv);
// Init & create json buffer
xbuf_t json_buf;
xbuf_init(&json_buf);
jsn_t *params = jsn_add_node(0, "params");
[...]
http_t *http = (http_t*)get_env(argv, HTTP_HEADERS);
xbuf_t *read_buf = (xbuf_t*)get_env(argv, READ_XBUF);
[...]
// Add remote ip (from X-Forwarded-for or REMOTE_ADDR)
char *xforward = xbuf_findstr(read_buf, "X-Forwarded-For:");
if(xforward) {
jsn_add_string(params, "ip", xforward);
} else {
jsn_add_string(params, "ip", get_env(argv, REMOTE_ADDR));
}
json部分当然是应用程序的一部分,与问题无关。 你认为这是一种正确的方法吗?或者xbuf_findstr()效率低下并且有一个更快的解决方案(不使用ASM或神秘的代码)?
谢谢:)
编辑:哇,我忘记了删除第一个字段的strok()部分,我当然只想要ip地址。
EDIT2:使用strtok修补版本
// Add remote ip (from X-Forwarded-for or REMOTE_ADDR)
char *xforward = xbuf_findstr(read_buf, "X-Forwarded-For: ");
if(xforward) {
gc_init(argv, 1024);
char *copy = gc_malloc(argv, strlen(xforward)+ 1);
memcpy(copy, xforward, strlen(xforward) + 1);
strtok(copy, ":");
char *ip = strtok(0,"\r");
while (*ip == ' ') ip++; // Trim leading space
jsn_add_string(params, "ip", ip);
} else {
jsn_add_string(params, "ip", get_env(argv, REMOTE_ADDR));
}
答案 0 :(得分:0)
最快的方式?
如果此代码在HTTP请求PARSING G-WAN状态之后执行,那么您可以从最近的位置(另一个HTTP标头)开始搜索"X-Forwarded-For: "
,而不是从REQUEST的开头执行此操作。
没有办法明显快于xbuf_findstr()
。字符串搜索方法比其他方法更快,具体取决于输入数据的长度,这在这里并不重要。
"X-Forwarded-For: "
由G-WAN解析,但由于我们在G-WAN中实现了代理功能,并且由于"X-Forwarded-For: "
标头可能是假的,我们将其从解析器中删除