* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <http_parser.h>
#include "config.h"
#include "url.h"
#include "util.h"
#include "message.h"
#include "http.h"
#include "acism.h"
+#include "http_parser.h"
typedef struct url_match_s {
const gchar *m_begin;
} \
} while (0)
+static gboolean
+is_url_start (gchar c)
+{
+ if (c == '(' ||
+ c == '{' ||
+ c == '<' ||
+ c == '\'') {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+is_url_end (gchar c)
+{
+ if (c == ')' ||
+ c == '}' ||
+ c == '>' ||
+ c == '\'') {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static gint
rspamd_mailto_parse (struct http_parser_url *u, const gchar *str, gsize len,
gchar const **end, gboolean strict)
p++;
}
else {
- if (*p != '.' && *p != '-' && *p != '_' && *p != '%') {
+ if (is_url_end (t)) {
+ goto set;
+ }
+ else if (*p != '.' && *p != '-' && *p != '_' && *p != '%') {
uc = g_utf8_get_char_validated (p, last - p);
if (uc == (gunichar) -1) {
c = p + 1;
st = parse_part;
}
+ else if (is_url_end (t)) {
+ goto set;
+ }
else if (!g_ascii_isdigit (t)) {
if (strict || !g_ascii_isspace (t)) {
goto out;
c = p + 1;
st = parse_query;
}
+ else if (is_url_end (t)) {
+ goto set;
+ }
else if (is_lwsp (t)) {
if (strict) {
if (g_ascii_isspace (t)) {
c = p + 1;
st = parse_part;
}
+ else if (is_url_end (t)) {
+ goto set;
+ }
else if (is_lwsp (t)) {
if (strict) {
if (g_ascii_isspace (t)) {
p++;
break;
case parse_part:
- if (is_lwsp (t)) {
+ if (is_url_end (t)) {
+ goto set;
+ }
+ else if (is_lwsp (t)) {
if (strict) {
if (g_ascii_isspace (t)) {
goto set;
'\'', '\''
};
-static gboolean
-is_url_start (gchar c)
-{
- if (c == '(' ||
- c == '{' ||
- c == '<' ||
- c == '\'') {
- return TRUE;
- }
-
- return FALSE;
-}
static gboolean
url_file_start (struct url_callback_data *cb,