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;
}