用G-Wan快速(est)获得X-Forwarded-for标头的方式?

时间:2013-08-23 16:18:19

标签: parsing http-headers g-wan http-proxy

由于这个非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));
  }

1 个答案:

答案 0 :(得分:0)

  

最快的方式?

如果此代码在HTTP请求PARSING G-WAN状态之后执行,那么您可以从最近的位置(另一个HTTP标头)开始搜索"X-Forwarded-For: ",而不是从REQUEST的开头执行此操作。

没有办法明显快于xbuf_findstr()。字符串搜索方法比其他方法更快,具体取决于输入数据的长度,这在这里并不重要。

过去,

"X-Forwarded-For: "由G-WAN解析,但由于我们在G-WAN中实现了代理功能,并且由于"X-Forwarded-For: "标头可能是假的,我们将其从解析器中删除