📄 url.c
字号:
* scrolling_position = 0 * } * * Return NULL if URL is badly formed. */DilloUrl* a_Url_new(const gchar *url_str, const gchar *base_url, gint flags, gint32 posx, gint32 posy){ DilloUrl *url; gchar *urlstring, *p, *s; GString *SolvedUrl; gint n_ic; g_return_val_if_fail (url_str != NULL, NULL); /* denounce illegal characters (0x00-0x1F, 0x7F and space) */ urlstring = (gchar *)url_str; for (p = s = urlstring; *s; s++) if (*s > 0x1F && *s != 0x7F && *s != ' ') p++; /* number of illegal characters */ n_ic = s - p; /* let's use a heuristic to set http: as default */ if (!base_url) { base_url = "http:"; if (urlstring[0] != '/') { p = strpbrk(urlstring, "/#?:"); if (!p || *p != ':') urlstring = g_strconcat("//", urlstring, NULL); } else if (urlstring[1] != '/') urlstring = g_strconcat("/", urlstring, NULL); } /* Resolve the URL */ SolvedUrl = Url_resolve_relative(urlstring, NULL, base_url); DEBUG_MSG(2, "SolvedUrl = %s\n", SolvedUrl->str); g_return_val_if_fail (SolvedUrl != NULL, NULL); /* Fill url data */ url = Url_object_new(SolvedUrl->str); url->url_string = SolvedUrl; url->flags = flags; url->scrolling_position_x = posx; url->scrolling_position_y = posy; url->illegal_chars = n_ic; return url;}/* * Duplicate a Url structure */DilloUrl* a_Url_dup(const DilloUrl *ori){ DilloUrl *url; url = Url_object_new(URL_STR_(ori)); g_return_val_if_fail (url != NULL, NULL); url->url_string = g_string_new(URL_STR(ori)); url->port = ori->port; url->flags = ori->flags; url->data = g_strdup(ori->data); url->alt = g_strdup(ori->alt); url->ismap_url_len = ori->ismap_url_len; url->scrolling_position_x = ori->scrolling_position_x; url->scrolling_position_y = ori->scrolling_position_y; return url;}/* * Compare two Url's to check if they are the same. * The fields which are compared here are: * <scheme>, <authority>, <path>, <query> and <data> * Other fields are left for the caller to check * * Return value: 0 if equal, 1 otherwise */gint a_Url_cmp(const DilloUrl *A, const DilloUrl *B){ if (!A || !B) return 1; if (A == B || (URL_STRCAMP_I_EQ(A->authority, B->authority) && URL_STRCAMP_EQ(A->path, B->path) && URL_STRCAMP_EQ(A->query, B->query) && URL_STRCAMP_EQ(A->data, B->data) && URL_STRCAMP_I_EQ(A->scheme, B->scheme))) return 0; return 1;}/* * Set DilloUrl flags */void a_Url_set_flags(DilloUrl *u, gint flags){ if (u) u->flags = flags;}/* * Set DilloUrl data (like POST info, etc.) */void a_Url_set_data(DilloUrl *u, gchar *data){ if (u) { g_free((gchar *)u->data); u->data = g_strdup(data); }}/* * Set DilloUrl alt (alternate text to the URL. Used by image maps) */void a_Url_set_alt(DilloUrl *u, const gchar *alt){ if (u) { g_free((gchar *)u->alt); u->alt = g_strdup(alt); }}/* * Set DilloUrl scrolling position */void a_Url_set_pos(DilloUrl *u, gint32 posx, gint32 posy){ if (u) { u->scrolling_position_x = posx; u->scrolling_position_y = posy; }}/* * Set DilloUrl ismap coordinates * (this is optimized for not hogging the CPU) */void a_Url_set_ismap_coords(DilloUrl *u, gchar *coord_str){ g_return_if_fail(u && coord_str); if ( !u->ismap_url_len ) { /* Save base-url length (without coords) */ u->ismap_url_len = URL_STR_(u) ? u->url_string->len : 0; a_Url_set_flags(u, URL_FLAGS(u) | URL_Ismap); } if (u->url_string) { g_string_truncate(u->url_string, u->ismap_url_len); g_string_append(u->url_string, coord_str); u->query = u->url_string->str + u->ismap_url_len + 1; }}/* * Given an hex octet (e.g., e3, 2F, 20), return the corresponding * character if the octet is valid, and -1 otherwise */static int Url_decode_hex_octet(const gchar *s){ gint hex_value; gchar *tail, hex[3]; if (s && (hex[0] = s[0]) && (hex[1] = s[1])) { hex[2] = 0; hex_value = strtol(hex, &tail, 16); if (tail - hex == 2) return hex_value; } return -1;}/* * Parse possible hexadecimal octets in the URI path. * Returns a new allocated string. */gchar *a_Url_decode_hex_str(const char *str){ gchar *new_str, *dest; int i, val; if (!str) return NULL; /* most cases won't have hex octets */ if (!strchr(str, '%')) return g_strdup(str); dest = new_str = g_new(gchar, strlen(str) + 1); for (i = 0; str[i]; i++) { *dest++ = (str[i] == '%' && (val = Url_decode_hex_octet(str+i+1)) >= 0) ? i+=2, val : str[i]; } *dest++ = 0; new_str = g_realloc(new_str, sizeof(gchar) * (dest - new_str)); return new_str;}/* * Urlencode 'str' * -RL :: According to the RFC 1738, only alphanumerics, the special * characters "$-_.+!*'(),", and reserved characters ";/?:@=&" used * for their *reserved purposes* may be used unencoded within a URL. * We'll escape everything but alphanumeric and "-_.*" (as lynx). --Jcid * * Note: the content type "application/x-www-form-urlencoded" is used: * i.e., ' ' -> '+' and '\n' -> CR LF (see HTML 4.01, Sec. 17.13.4) */gchar *a_Url_encode_hex_str(const gchar *str){ static const char *verbatim = "-_.*"; static const char *hex = "0123456789ABCDEF"; char *newstr, *c; if (!str) return NULL; newstr = g_new(char, 6*strlen(str)+1); for (c = newstr; *str; str++) if ((isalnum(*str) && !(*str & 0x80)) || strchr(verbatim, *str)) /* we really need isalnum for the "C" locale */ *c++ = *str; else if (*str == ' ') *c++ = '+'; else if (*str == '\n') { *c++ = '%'; *c++ = '0'; *c++ = 'D'; *c++ = '%'; *c++ = '0'; *c++ = 'A'; } else { *c++ = '%'; *c++ = hex[(*str >> 4) & 15]; *c++ = hex[*str & 15]; } *c = 0; return newstr;}/* * RFC-2396 suggests this stripping when "importing" URLs from other media. * Strip: "URL:", enclosing < >, and embedded whitespace. * (We also strip illegal chars: 00-1F and 7F) */gchar *a_Url_string_strip_delimiters(gchar *str){ gchar *p, *new_str, *text; new_str = text = g_strdup(str); if (new_str) { if (strncmp(new_str, "URL:", 4) == 0) text += 4; if (*text == '<') text++; for (p = new_str; *text; text++) if (*text > 0x1F && *text != 0x7F && *text != ' ') *p++ = *text; if (p > new_str && p[-1] == '>') --p; *p = 0; } return new_str;}gboolean a_Url_does_visited (DilloUrl *u){ return TRUE;}/* * Given an hex octet (e3, 2F, 20), return the corresponding * character if the octet is valid, and -1 otherwise */static int Url_parse_hex_octet(const gchar *s){ gint hex_value; gchar *tail, hex[3]; if ( (hex[0] = s[0]) && (hex[1] = s[1]) ) { hex[2] = 0; hex_value = strtol(hex, &tail, 16); if (tail - hex == 2) return hex_value; } return -1;}/* * Parse possible hexadecimal octets in the URI path * Returns new allocated string. */gchar *a_Url_parse_hex_path(const DilloUrl *u){ const gchar *src; gchar *new_uri, *dest; int i, val; if (!u || !u->path || !u->path[0]) return NULL; /* most cases won't have hex octets */ if (!strchr(u->path, '%')) return g_strdup(u->path); src = u->path; dest = new_uri = g_new(gchar, strlen(src) + 1); for (i = 0; src[i]; i++) { *dest++ = (src[i] == '%' && (val = Url_parse_hex_octet(src+i+1)) >= 0) ? val + !(i+=2) : src[i]; } *dest++ = 0; new_uri = g_realloc(new_uri, sizeof(gchar) * (dest - new_uri)); return new_uri;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -