Unverified Commit 6535b930 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Curl_follow: return better errors on URL problems

... by making the converter function global and accessible.

Closes #3153
parent ca10fae6
Loading
Loading
Loading
Loading
+2 −4
Original line number Original line Diff line number Diff line
@@ -1516,13 +1516,11 @@ CURLcode Curl_follow(struct Curl_easy *data,
  DEBUGASSERT(data->state.uh);
  DEBUGASSERT(data->state.uh);
  uc = curl_url_set(data->state.uh, CURLUPART_URL, newurl, 0);
  uc = curl_url_set(data->state.uh, CURLUPART_URL, newurl, 0);
  if(uc)
  if(uc)
    /* TODO: consider an error code remap here */
    return Curl_uc_to_curlcode(uc);
    return CURLE_URL_MALFORMAT;


  uc = curl_url_get(data->state.uh, CURLUPART_URL, &newurl, 0);
  uc = curl_url_get(data->state.uh, CURLUPART_URL, &newurl, 0);
  if(uc)
  if(uc)
    /* TODO: consider an error code remap here */
    return Curl_uc_to_curlcode(uc);
    return CURLE_OUT_OF_MEMORY;


  if(type == FOLLOW_FAKE) {
  if(type == FOLLOW_FAKE) {
    /* we're only figuring out the new url if we would've followed locations
    /* we're only figuring out the new url if we would've followed locations
+9 −9
Original line number Original line Diff line number Diff line
@@ -1996,7 +1996,7 @@ static CURLcode findprotocol(struct Curl_easy *data,
}
}




static CURLcode uc_to_curlcode(CURLUcode uc)
CURLcode Curl_uc_to_curlcode(CURLUcode uc)
{
{
  switch(uc) {
  switch(uc) {
  default:
  default:
@@ -2048,11 +2048,11 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
                     CURLU_DISALLOW_USER : 0) |
                     CURLU_DISALLOW_USER : 0) |
                    (data->set.path_as_is ? CURLU_PATH_AS_IS : 0));
                    (data->set.path_as_is ? CURLU_PATH_AS_IS : 0));
  if(uc)
  if(uc)
    return uc_to_curlcode(uc);
    return Curl_uc_to_curlcode(uc);


  uc = curl_url_get(uh, CURLUPART_SCHEME, &data->state.up.scheme, 0);
  uc = curl_url_get(uh, CURLUPART_SCHEME, &data->state.up.scheme, 0);
  if(uc)
  if(uc)
    return uc_to_curlcode(uc);
    return Curl_uc_to_curlcode(uc);


  result = findprotocol(data, conn, data->state.up.scheme);
  result = findprotocol(data, conn, data->state.up.scheme);
  if(result)
  if(result)
@@ -2067,7 +2067,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
    conn->bits.user_passwd = TRUE;
    conn->bits.user_passwd = TRUE;
  }
  }
  else if(uc != CURLUE_NO_USER)
  else if(uc != CURLUE_NO_USER)
    return uc_to_curlcode(uc);
    return Curl_uc_to_curlcode(uc);


  uc = curl_url_get(uh, CURLUPART_PASSWORD, &data->state.up.password,
  uc = curl_url_get(uh, CURLUPART_PASSWORD, &data->state.up.password,
                    CURLU_URLDECODE);
                    CURLU_URLDECODE);
@@ -2078,7 +2078,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
    conn->bits.user_passwd = TRUE;
    conn->bits.user_passwd = TRUE;
  }
  }
  else if(uc != CURLUE_NO_PASSWORD)
  else if(uc != CURLUE_NO_PASSWORD)
    return uc_to_curlcode(uc);
    return Curl_uc_to_curlcode(uc);


  uc = curl_url_get(uh, CURLUPART_OPTIONS, &data->state.up.options,
  uc = curl_url_get(uh, CURLUPART_OPTIONS, &data->state.up.options,
                    CURLU_URLDECODE);
                    CURLU_URLDECODE);
@@ -2088,7 +2088,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
      return CURLE_OUT_OF_MEMORY;
      return CURLE_OUT_OF_MEMORY;
  }
  }
  else if(uc != CURLUE_NO_OPTIONS)
  else if(uc != CURLUE_NO_OPTIONS)
    return uc_to_curlcode(uc);
    return Curl_uc_to_curlcode(uc);


  uc = curl_url_get(uh, CURLUPART_HOST, &data->state.up.hostname, 0);
  uc = curl_url_get(uh, CURLUPART_HOST, &data->state.up.hostname, 0);
  if(uc) {
  if(uc) {
@@ -2098,7 +2098,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,


  uc = curl_url_get(uh, CURLUPART_PATH, &data->state.up.path, 0);
  uc = curl_url_get(uh, CURLUPART_PATH, &data->state.up.path, 0);
  if(uc)
  if(uc)
    return uc_to_curlcode(uc);
    return Curl_uc_to_curlcode(uc);


  uc = curl_url_get(uh, CURLUPART_PORT, &data->state.up.port,
  uc = curl_url_get(uh, CURLUPART_PORT, &data->state.up.port,
                    CURLU_DEFAULT_PORT);
                    CURLU_DEFAULT_PORT);
@@ -3082,12 +3082,12 @@ static CURLcode override_login(struct Curl_easy *data,
  if(user_changed) {
  if(user_changed) {
    uc = curl_url_set(data->state.uh, CURLUPART_USER, *userp, 0);
    uc = curl_url_set(data->state.uh, CURLUPART_USER, *userp, 0);
    if(uc)
    if(uc)
      return uc_to_curlcode(uc);
      return Curl_uc_to_curlcode(uc);
  }
  }
  if(passwd_changed) {
  if(passwd_changed) {
    uc = curl_url_set(data->state.uh, CURLUPART_PASSWORD, *passwdp, 0);
    uc = curl_url_set(data->state.uh, CURLUPART_PASSWORD, *passwdp, 0);
    if(uc)
    if(uc)
      return uc_to_curlcode(uc);
      return Curl_uc_to_curlcode(uc);
  }
  }
  return CURLE_OK;
  return CURLE_OK;
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -50,6 +50,7 @@ CURLcode Curl_init_userdefined(struct Curl_easy *data);
void Curl_freeset(struct Curl_easy * data);
void Curl_freeset(struct Curl_easy * data);
/* free the URL pieces */
/* free the URL pieces */
void Curl_up_free(struct Curl_easy *data);
void Curl_up_free(struct Curl_easy *data);
CURLcode Curl_uc_to_curlcode(CURLUcode uc);
CURLcode Curl_close(struct Curl_easy *data); /* opposite of curl_open() */
CURLcode Curl_close(struct Curl_easy *data); /* opposite of curl_open() */
CURLcode Curl_connect(struct Curl_easy *, struct connectdata **,
CURLcode Curl_connect(struct Curl_easy *, struct connectdata **,
                      bool *async, bool *protocol_connect);
                      bool *async, bool *protocol_connect);