Returns 'https://hostname[:port][/urlpath]' in a newly malloc'ed string.
Signed-off-by: Daniel Lenski <dlenski@gmail.com>
while (1) {
char *form_buf = NULL;
int role_select = 0;
- struct oc_text_buf *url;
+ char *url;
if (resp_buf && resp_buf->pos)
ret = do_https_request(vpninfo, "POST",
if (ret < 0)
break;
- url = buf_alloc();
- buf_append(url, "https://%s", vpninfo->hostname);
- if (vpninfo->port != 443)
- buf_append(url, ":%d", vpninfo->port);
- buf_append(url, "/");
- if (vpninfo->urlpath)
- buf_append(url, "%s", vpninfo->urlpath);
-
- if (buf_error(url)) {
+ if (!check_cookie_success(vpninfo)) {
free(form_buf);
- ret = buf_free(url);
+ ret = 0;
break;
}
- if (!check_cookie_success(vpninfo)) {
- buf_free(url);
+ url = internal_get_url(vpninfo);
+ if (!url) {
free(form_buf);
- ret = 0;
+ ret = -ENOMEM;
break;
}
- doc = htmlReadMemory(form_buf, ret, url->data, NULL,
+ doc = htmlReadMemory(form_buf, ret, url, NULL,
HTML_PARSE_RECOVER|HTML_PARSE_NOERROR|HTML_PARSE_NOWARNING|HTML_PARSE_NONET);
- buf_free(url);
+ free(url);
free(form_buf);
if (!doc) {
vpn_progress(vpninfo, PRG_ERR,
{
xmlNodePtr root, node;
xmlDocPtr doc = xmlpost_new_query(vpninfo, "init", &root);
- struct oc_text_buf *url_buf;
+ char *url;
if (!doc)
return -ENOMEM;
- url_buf = buf_alloc();
- buf_append(url_buf, "https://%s", vpninfo->hostname);
- if (vpninfo->port != 443)
- buf_append(url_buf, ":%d", vpninfo->port);
- /* Do we *need* to omit the trailing / here when no path? */
- if (vpninfo->urlpath)
- buf_append(url_buf, "/%s", vpninfo->urlpath);
-
- if (buf_error(url_buf))
+ url = internal_get_url(vpninfo);
+ if (!url)
goto bad;
- node = xmlNewTextChild(root, NULL, XCAST("group-access"), XCAST(url_buf->data));
+ node = xmlNewTextChild(root, NULL, XCAST("group-access"), XCAST(url));
if (!node)
goto bad;
if (cert_fail) {
if (!node)
goto bad;
}
- buf_free(url_buf);
+ free(url);
return xmlpost_complete(doc, request_body);
bad:
- buf_free(url_buf);
xmlpost_complete(doc, NULL);
return -ENOMEM;
}
return 0;
}
+char *internal_get_url(struct openconnect_info *vpninfo)
+{
+ char *url;
+ if (asprintf(&url, "https://%s%s%s", vpninfo->hostname, vpninfo->urlpath ? "/" : "", vpninfo->urlpath) < 0)
+ return NULL;
+ else
+ return url;
+}
+
void openconnect_clear_cookies(struct openconnect_info *vpninfo)
{
struct oc_vpn_option *opt, *next;
int process_proxy(struct openconnect_info *vpninfo, int ssl_sock);
int internal_parse_url(const char *url, char **res_proto, char **res_host,
int *res_port, char **res_path, int default_port);
+char *internal_get_url(struct openconnect_info *vpninfo);
int do_https_request(struct openconnect_info *vpninfo, const char *method,
const char *request_body_type, struct oc_text_buf *request_body,
char **form_buf, int fetch_redirect);