Skip to content
Snippets Groups Projects
Commit 19b284c2 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Gisle Vanem provided code that displays an error message when the (libidn

based) IDN conversion fails. This is really due to a missing suitable
function in the libidn API that I hope we can remove once libidn gets a
function like this.
parent 6b3e3095
No related branches found
No related tags found
No related merge requests found
......@@ -6,6 +6,12 @@
Changelog
Daniel (2 October 2004)
- Gisle Vanem provided code that displays an error message when the (libidn
based) IDN conversion fails. This is really due to a missing suitable
function in the libidn API that I hope we can remove once libidn gets a
function like this.
Daniel (1 October 2004)
- Aleksandar Milivojevic reported a problem in the Redhat bugzilla (see
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=134133) and not to
......
......@@ -27,6 +27,10 @@
#include <string.h>
#include <errno.h>
#ifdef USE_LIBIDN
#include <idna.h>
#endif
#include "strerror.h"
#define _MPRINTF_REPLACE /* use our functions only */
......@@ -556,3 +560,68 @@ const char *Curl_strerror(struct connectdata *conn, int err)
*p = '\0';
return buf;
}
#ifdef USE_LIBIDN
/*
* Return error-string for libidn status as returned
* from idna_to_ascii_lz().
*/
const char *Curl_idn_strerror (struct connectdata *conn, int err)
{
const char *str;
char *buf;
size_t max;
curlassert(conn);
buf = conn->syserr_buf;
max = sizeof(conn->syserr_buf)-1;
switch ((Idna_rc)err) {
case IDNA_SUCCESS:
str = "No error";
break;
case IDNA_STRINGPREP_ERROR:
str = "Error in string preparation";
break;
case IDNA_PUNYCODE_ERROR:
str = "Error in Punycode operation";
break;
case IDNA_CONTAINS_NON_LDH:
str = "Illegal ASCII characters";
break;
case IDNA_CONTAINS_MINUS:
str = "Contains minus";
break;
case IDNA_INVALID_LENGTH:
str = "Invalid output length";
break;
case IDNA_NO_ACE_PREFIX:
str = "No ACE prefix (\"xn--\")";
break;
case IDNA_ROUNDTRIP_VERIFY_ERROR:
str = "Roundtrip verify error";
break;
case IDNA_CONTAINS_ACE_PREFIX:
str = "Already have ACE prefix (\"xn--\")";
break;
case IDNA_ICONV_ERROR:
str = "Locale conversion failed";
break;
case IDNA_MALLOC_ERROR:
str = "Allocation failed";
break;
case IDNA_DLOPEN_ERROR:
str = "dlopen() error";
break;
default:
snprintf(buf, max, "error %d", (int)err);
str = NULL;
break;
}
if (str)
strncpy(buf, str, max);
buf[max] = '\0';
return (buf);
}
#endif /* USE_LIBIDN */
......@@ -27,4 +27,8 @@
const char *Curl_strerror (struct connectdata *conn, int err);
#ifdef USE_LIBIDN
const char *Curl_idn_strerror (struct connectdata *conn, int err);
#endif
#endif
......@@ -116,6 +116,7 @@ void idn_free (void *ptr); /* prototype from idn-free.h, not provided by
#include "progress.h"
#include "cookie.h"
#include "strequal.h"
#include "strerror.h"
#include "escape.h"
#include "strtok.h"
#include "share.h"
......@@ -2078,8 +2079,8 @@ static void fix_hostname(struct connectdata *conn, struct hostname *host)
infof (data, "Input domain encoded as `%s'\n",
stringprep_locale_charset ());
if (rc != IDNA_SUCCESS)
infof(data, "Failed to convert %s to ACE; IDNA error %d\n",
host->name, rc);
infof(data, "Failed to convert %s to ACE; %s\n",
host->name, Curl_idn_strerror(conn,rc));
else {
host->encalloc = ace_hostname;
/* change the name pointer to point to the encoded hostname */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment