struct worker_task *task = lua_check_task (L);
if (task) {
- lua_pushstring (L, task->raw_headers);
+ lua_pushstring (L, task->raw_headers_str);
}
else {
lua_pushnil (L);
lua_task_get_raw_header_common (lua_State * L, gboolean strong)
{
struct worker_task *task = lua_check_task (L);
- GList *cur;
struct raw_header *rh;
gint i = 1;
const gchar *name;
return 1;
}
lua_newtable (L);
- cur = g_list_first (task->raw_headers_list);
- while (cur) {
- rh = cur->data;
+ rh = g_hash_table_lookup (task->raw_headers, name);
+
+ if (rh == NULL) {
+ return 1;
+ }
+
+ while (rh) {
if (rh->name == NULL) {
- cur = g_list_next (cur);
+ rh = rh->next;
continue;
}
/* Check case sensivity */
if (strong) {
if (strcmp (rh->name, name) != 0) {
- cur = g_list_next (cur);
+ rh = rh->next;
continue;
}
}
else {
if (g_ascii_strcasecmp (rh->name, name) != 0) {
- cur = g_list_next (cur);
+ rh = rh->next;
continue;
}
}
lua_set_table_index (L, "separator", rh->separator);
lua_rawseti (L, -2, i++);
/* Process next element */
- cur = g_list_next (cur);
+ rh = rh->next;
}
}
else {
{
gchar *s, *p, t;
- /* We are intersted only with received from network headers */
+ /* We are interested only with received from network headers */
if ((p = strstr (line, "from network")) == NULL) {
r->is_error = 2;
return;
static void
process_raw_headers (struct worker_task *task)
{
- struct raw_header *new;
+ struct raw_header *new, *lp;
gchar *p, *c, *tmp, *tp;
gint state = 0, l, next_state, err_state, t_state;
gboolean valid_folding = FALSE;
- p = task->raw_headers;
+ p = task->raw_headers_str;
c = p;
while (*p) {
/* FSM for processing headers */
case 0:
/* Begin processing headers */
if (!g_ascii_isalpha (*p)) {
- /* We have some garbadge at the beginning of headers, skip this line */
+ /* We have some garbage at the beginning of headers, skip this line */
state = 100;
next_state = 0;
}
c = p;
}
else if (g_ascii_isspace (*p)) {
- /* Not header but some garbadge */
+ /* Not header but some garbage */
state = 100;
next_state = 0;
}
next_state = 3;
err_state = 4;
}
+ else if (*(p + 1) == '\0') {
+ state = 4;
+ }
else {
p ++;
}
}
*tp = '\0';
new->value = tmp;
- task->raw_headers_list = g_list_prepend (task->raw_headers_list, new);
+ new->next = NULL;
+ if ((lp = g_hash_table_lookup (task->raw_headers, new->name)) != NULL) {
+ while (lp->next != NULL) {
+ lp = lp->next;
+ }
+ lp->next = new;
+ }
+ else {
+ g_hash_table_insert (task->raw_headers, new->name, new);
+ }
debug_task ("add raw header %s: %s", new->name, new->value);
state = 0;
break;
case 5:
/* Header has only name, no value */
- task->raw_headers_list = g_list_prepend (task->raw_headers_list, new);
+ new->next = NULL;
+ if ((lp = g_hash_table_lookup (task->raw_headers, new->name)) != NULL) {
+ while (lp->next != NULL) {
+ lp = lp->next;
+ }
+ lp->next = new;
+ }
+ else {
+ g_hash_table_insert (task->raw_headers, new->name, new);
+ }
state = 0;
debug_task ("add raw header %s: %s", new->name, new->value);
break;
case 99:
/* Folding state */
- if (*p == '\r' || *p == '\n') {
- p ++;
- valid_folding = FALSE;
- }
- else if (*p == '\t' || *p == ' ') {
- /* Valid folding */
- p ++;
- valid_folding = TRUE;
+ if (*(p + 1) == '\0') {
+ state = err_state;
}
else {
- if (valid_folding) {
- debug_task ("go to state: %d->%d", state, next_state);
- state = next_state;
+ if (*p == '\r' || *p == '\n') {
+ p ++;
+ valid_folding = FALSE;
+ }
+ else if (*p == '\t' || *p == ' ') {
+ /* Valid folding */
+ p ++;
+ valid_folding = TRUE;
}
else {
- /* Fall back */
- debug_task ("go to state: %d->%d", state, err_state);
- state = err_state;
+ if (valid_folding) {
+ debug_task ("go to state: %d->%d", state, next_state);
+ state = next_state;
+ }
+ else {
+ /* Fall back */
+ debug_task ("go to state: %d->%d", state, err_state);
+ state = err_state;
+ }
}
}
break;
p ++;
state = next_state;
}
+ else if (*(p + 1) == '\0') {
+ state = next_state;
+ }
else {
p ++;
}
}
#ifdef GMIME24
- task->raw_headers = g_mime_object_get_headers (GMIME_OBJECT (task->message));
+ task->raw_headers_str = g_mime_object_get_headers (GMIME_OBJECT (task->message));
#else
- task->raw_headers = g_mime_message_get_headers (task->message);
+ task->raw_headers_str = g_mime_message_get_headers (task->message);
#endif
process_images (task);
g_list_free (first);
}
- if (task->raw_headers) {
- memory_pool_add_destructor (task->task_pool, (pool_destruct_func) g_free, task->raw_headers);
+ if (task->raw_headers_str) {
+ memory_pool_add_destructor (task->task_pool, (pool_destruct_func) g_free, task->raw_headers_str);
process_raw_headers (task);
- memory_pool_add_destructor (task->task_pool, (pool_destruct_func) g_list_free, task->raw_headers_list);
}
task->rcpts = g_mime_message_get_all_recipients (message);
GList*
message_get_raw_header (struct worker_task *task, const gchar *field, gboolean strong)
{
- GList *cur, *gret = NULL;
+ GList *gret = NULL;
struct raw_header *rh;
- cur = task->raw_headers_list;
- while (cur) {
- rh = cur->data;
+ rh = g_hash_table_lookup (task->raw_headers, field);
+
+ if (rh == NULL) {
+ return NULL;
+ }
+
+ while (rh) {
if (strong) {
if (strcmp (rh->name, field) == 0) {
gret = g_list_prepend (gret, rh);
gret = g_list_prepend (gret, rh);
}
}
- cur = g_list_next (cur);
+ rh = rh->next;
}
if (gret != NULL) {