};
typedef struct httpcookie_t_ httpcookie_t;
+LOCAL Bool httpcookie_isvalueset(httpcookie_t *cookie)
+{
+ if (cookie->attr.len == 0) {
+ return False;
+ }
+ if (cookie->name.len == 0) {
+ return False;
+ }
+ return True;
+}
+
LOCAL httpcookie_t* httpcookie_nextnode(httpcookie_t *cookie)
{
return (httpcookie_t*)cookie->que.next;
LOCAL VOID httpcookie_QueRemove(httpcookie_t *cookie)
{
QueRemove(&cookie->que);
+ QueInit(&cookie->que);
}
LOCAL W httpcookie_initialize(httpcookie_t *cookie, UB *host, W host_len)
LOCAL Bool cookiedb_writeiterator_checksendcondition(cookiedb_writeiterator_t *iter, httpcookie_t *cookie)
{
- return False;
+ return True;
}
LOCAL Bool cookiedb_writeiterator_next(cookiedb_writeiterator_t *iter, httpcookie_t **cookie)
COOKIEDB_WRITEITERATORCONTEXT_STATE_VALUE,
COOKIEDB_WRITEITERATORCONTEXT_STATE_COLON,
COOKIEDB_WRITEITERATORCONTEXT_STATE_CRLF,
+ COOKIEDB_WRITEITERATORCONTEXT_STATE_END,
} state;
httpcookie_t *current;
};
}
*str = cookiedb_writeheader_context_headername;
*len = 8;
+ context->state = COOKIEDB_WRITEITERATORCONTEXT_STATE_NAME;
return True;
case COOKIEDB_WRITEITERATORCONTEXT_STATE_NAME:
*str = context->current->attr.str;
case COOKIEDB_WRITEITERATORCONTEXT_STATE_CRLF:
*str = cookiedb_writeheader_context_crlf;
*len = 2;
+ context->state = COOKIEDB_WRITEITERATORCONTEXT_STATE_END;
+ return True;
+ case COOKIEDB_WRITEITERATORCONTEXT_STATE_END:
return False;
}
free(context);
return NULL;
}
- context->reading = httpcookie_new(host, host_len);
- if (context->reading == NULL) {
- ascstr_finalize(&context->host);
- free(context);
- return NULL;
- }
- QueInit(&context->sentinel);
context->reading = NULL;
+ QueInit(&context->sentinel);
context->state = COOKIEDB_READHEADERCONTEXT_STATE_START;
return context;
}
httpcookie_delete(cookie);
}
- if (context->reading == NULL) {
+ if (context->reading != NULL) {
httpcookie_delete(context->reading);
}
{
if (cookie->expires == 0) {
cookie_volatiledb_insertcookie(&db->vdb, cookie);
- } if (cookie->expires < current) {
+ } else if (cookie->expires < current) {
cookie_persistentdb_insertcookie(&db->pdb, cookie);
} else { /* cookie->expires >= current */
httpcookie_delete(cookie);
EXPORT VOID cookiedb_endheaderread(cookiedb_t *db, cookiedb_readheadercontext_t *context)
{
httpcookie_t *cookie;
+ Bool ok;
for (;;) {
cookie = cookiedb_readheadercontext_prevcookie(context);
cookiedb_inserteachdb(db, cookie, context->current);
}
if (context->reading != NULL) {
- httpcookie_QueRemove(context->reading);
- cookiedb_inserteachdb(db, context->reading, context->current);
+ ok = httpcookie_isvalueset(context->reading);
+ if (ok == True) {
+ httpcookie_QueRemove(context->reading);
+ cookiedb_inserteachdb(db, context->reading, context->current);
+ } else {
+ httpcookie_delete(context->reading);
+ }
context->reading = NULL;
}