static int _wemq_proxy_load_by_http()

in eventmesh-sdks/eventmesh-sdk-c/src/rmb_access_config.c [224:392]


static int _wemq_proxy_load_by_http (StWemqProxy * pproxy, size_t size,
                                     const char *url, long timeout)
{

  int ret = 0;
  if (pproxy == NULL || url == NULL)
  {
    LOGRMB (RMB_LOG_ERROR, "pproxy or url is null");
    return -1;
  }

  char *servers = NULL;
  struct rmb_http_buffer req;
  req.len = 0;
  req.data = (char *) malloc (sizeof (char));
  if (req.data == NULL)
  {
    LOGRMB (RMB_LOG_ERROR, "malloc for req.data failed");
    return -1;
  }

  if ((ret = rmb_http_easy_get (url, (void *) &req, timeout)) != 0)
  {
    LOGRMB (RMB_LOG_ERROR, "rmb_http_easy_get error,iRet=%d", ret);
    ret = -2;
    goto _LOAD_ITEM_END;
  }

  servers = (char *) malloc (sizeof (char) * (req.len + 1));
  if (servers == NULL)
  {
    LOGRMB (RMB_LOG_ERROR, "malloc for servers failed");
    free (req.data);
    req.data = NULL;
    return -1;
  }

  LOGRMB (RMB_LOG_INFO, "_wemq_proxy_load_by_http:[resp:len=%u,%s]!",
          (unsigned int) req.len, req.data);
  if (req.len <= 2)
    return -1;
  // 解析json字符串

  WEMQJSON *json = json_tokener_parse (req.data);
  WEMQJSON *wemq_proxy_servers = NULL;
  if (json == NULL)
  {
    LOGRMB (RMB_LOG_ERROR,
            "_wemq_proxy_load_by_http: json_tokener_parse error!");
    ret = -3;
    goto _LOAD_ITEM_END;
  }

  char *config_param = "wemqAccessServer";
  if (strstr (url, "wemqAccessServer") == NULL)
    config_param = pRmbStConfig->strDepartMent;
  if (!json_object_object_get_ex (json, config_param, &wemq_proxy_servers))
  {
    LOGRMB (RMB_LOG_ERROR,
            "_wemq_proxy_load_by_http: json_object_object_get_ex error!");
    ret = -3;
    json_object_put (json);
    goto _LOAD_ITEM_END;
  }

  const char *pservers = json_object_get_string (wemq_proxy_servers);
  if (pservers != NULL)
  {
    snprintf (servers, WEMQ_PROXY_BUFFER_SIZE, "%s", pservers);
  }
  else
  {
    LOGRMB (RMB_LOG_ERROR,
            "_wemq_proxy_load_by_http: wemqAccessServer is null");
  }
  json_object_put (json);

  LOGRMB (RMB_LOG_INFO, "_wemq_proxy_load_by_http: [servers:%s]!", servers);

  json = json_tokener_parse (servers);
  wemq_proxy_servers = NULL;
  if (json == NULL)
  {
    LOGRMB (RMB_LOG_ERROR,
            "_wemq_proxy_load_by_http: json_tokener_parse error!");
    ret = -3;
    goto _LOAD_ITEM_END;
  }

  //如果当前子系统有特定的access,没有就默认
  if (!json_object_object_get_ex
      (json, pRmbStConfig->cConsumerSysId, &wemq_proxy_servers))
  {
    LOGRMB (RMB_LOG_INFO,
            "current subsystem does not have special access list");
    if (!json_object_object_get_ex
        (json, "wemqAccessServer", &wemq_proxy_servers))
    {
      LOGRMB (RMB_LOG_ERROR,
              "_wemq_proxy_load_by_http: json_object_object_get_ex error!");
      ret = -3;
      json_object_put (json);
      goto _LOAD_ITEM_END;
    }

  }

  pservers = json_object_get_string (wemq_proxy_servers);
  if (pservers != NULL)
  {
    snprintf (servers, WEMQ_PROXY_BUFFER_SIZE, "%s", pservers);
  }
  else
  {
    LOGRMB (RMB_LOG_ERROR,
            "_wemq_proxy_load_by_http: wemqAccessServer is null");
  }
  json_object_put (json);

  // 解析每个字段
  trim (servers);
  {
    char *item = NULL;
    char *saveptr = NULL;
    char *ptr = servers;
    int i = 0;

    while ((item = strtok_r (ptr, ";", &saveptr)) != NULL)
    {
      if (i >= (int) size)
      {
        LOGRMB (RMB_LOG_WARN,
                " [index: %d] [size: %zu] _wemq_proxy_load_by_http: servers too more!\n",
                i, size);
        break;
      }
      if (_wemq_proxy_load_item (&pproxy[i], item, strlen (item)) == 0)
      {
        i++;
      }
      else
      {
        LOGRMB (RMB_LOG_WARN,
                "[item: %s] _wemq_proxy_load_by_http:  _wemq_proxy_load_item error!\n",
                item);
      }
      ptr = NULL;
    }
    if (i == 0)
    {
      LOGRMB (RMB_LOG_ERROR, "_wemq_proxy_load_by_http: servers is 0!\n");
    }

    ret = i;
  }

_LOAD_ITEM_END:
  if (req.data != NULL)
  {
    free (req.data);
    req.data = NULL;
  }
  if (servers != NULL)
  {
    free (servers);
    servers = NULL;
  }
  return ret;
}