/*
* submitutil.c
*
- * Copyright (c) 2010 project bchan
+ * Copyright (c) 2010-2011 project bchan
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
#include "submitutil.h"
#include "sjisstring.h"
#include "parselib.h"
+#include "cookiedb.h"
+#include "setcookieheader.h"
#define MAKEHEADER_ERR_LEN(dest, dest_len, src, len) \
err = sjstring_appendasciistring(dest, dest_len, src, len); \
return 0;
}
+LOCAL W submitutil_setcookie_inputparserresult(cookiedb_readheadercontext_t *ctx, setcookieparser_result_t *result)
+{
+ W err, i;
+ W (*proc)(cookiedb_readheadercontext_t *context, UB ch);
+
+ err = 0;
+ switch (result->type) {
+ case SETCOOKIEPARSER_RESULT_TYPE_NAMEATTR:
+ for (i = 0; i < result->val.name.len; i++) {
+ err = cookiedb_readheadercontext_appendchar_attr(ctx, result->val.name.str[i]);
+ if (err < 0) {
+ break;
+ }
+ }
+ break;
+ case SETCOOKIEPARSER_RESULT_TYPE_VALUE:
+ switch (result->val.value.attr) {
+ case SETCOOKIEPARSER_ATTR_COMMENT:
+ proc = cookiedb_readheadercontext_appendchar_comment;
+ break;
+ case SETCOOKIEPARSER_ATTR_DOMAIN:
+ proc = cookiedb_readheadercontext_appendchar_domain;
+ break;
+ case SETCOOKIEPARSER_ATTR_PATH:
+ proc = cookiedb_readheadercontext_appendchar_path;
+ break;
+ case SETCOOKIEPARSER_ATTR_VERSION:
+ proc = cookiedb_readheadercontext_appendchar_version;
+ break;
+ case SETCOOKIEPARSER_ATTR_NAME:
+ proc = cookiedb_readheadercontext_appendchar_name;
+ break;
+ case SETCOOKIEPARSER_ATTR_EXPIRES:
+ case SETCOOKIEPARSER_ATTR_MAX_AGE:
+ case SETCOOKIEPARSER_ATTR_SECURE:
+ default:
+ proc = NULL;
+ break;
+ }
+ if (proc != NULL) {
+ for (i = 0; i < result->val.value.len; i++) {
+ err = (*proc)(ctx, result->val.value.str[i]);
+ if (err < 0) {
+ break;
+ }
+ }
+ }
+ break;
+ case SETCOOKIEPARSER_RESULT_TYPE_SECUREATTR:
+ err = cookiedb_readheadercontext_setsecure(ctx);
+ break;
+ case SETCOOKIEPARSER_RESULT_TYPE_EXPIRESATTR:
+ err = cookiedb_readheadercontext_setexpires(ctx, result->val.expires.time);
+ break;
+ }
+
+ return err;
+}
+
+LOCAL W submitutil_setcookie(setcookieparser_t *parser, cookiedb_t *db, UB *str, W len, UB *host, W host_len, UB *path, W path_len, STIME time)
+{
+ cookiedb_readheadercontext_t *ctx;
+ setcookieparser_result_t *result;
+ W i, j, err, ret, result_len;
+
+ ctx = cookiedb_startheaderread(db, host, host_len, path, path_len, time);
+ if (ctx == NULL) {
+ return -1; /* TODO */
+ }
+
+ err = 0;
+ for (i = 0; i < len; i++) {
+ if (str[i] == '\r') {
+ break;
+ }
+ ret = setcookieparser_inputchar(parser, str[i], &result, &result_len);
+ if (ret != SETCOOKIEPARSER_CONTINUE) {
+ break;
+ }
+ err = 0;
+ for (j = 0; j < result_len; j++) {
+ err = submitutil_setcookie_inputparserresult(ctx, result + j);
+ if (err < 0) {
+ break;
+ }
+ }
+ if (err < 0) {
+ break;
+ }
+ }
+ if (err == 0) {
+ ret = setcookieparser_endinput(parser, &result, &result_len);
+ if (ret == SETCOOKIEPARSER_CONTINUE) {
+ for (j = 0; j < result_len; j++) {
+ err = submitutil_setcookie_inputparserresult(ctx, result + j);
+ }
+ }
+ }
+
+ cookiedb_endheaderread(db, ctx);
+
+ return err;
+}
+
+EXPORT W submitutil_updatecookiedb(cookiedb_t *db, UB *prev_header, W prev_header_len, UB *host, W host_len, STIME time)
+{
+ UB *ptr, *start;
+ W err;
+ setcookieparser_t parser;
+ UB *path = "/test/bbs.cgi";
+ W path_len = strlen(path);
+
+ for (ptr = prev_header; ptr < prev_header + prev_header_len;) {
+ ptr = strstr(ptr, "Set-Cookie:");
+ if (ptr == NULL) {
+ break;
+ }
+ ptr += 11;
+ for (;ptr < prev_header + prev_header_len; ptr++) {
+ if (*ptr != ' ') {
+ break;
+ }
+ }
+ start = ptr;
+ for (;ptr < prev_header + prev_header_len; ptr++) {
+ if (*ptr == '\r') {
+ ptr++;
+ if (*ptr == '\n') {
+ ptr++;
+ break;
+ }
+ }
+ }
+ err = setcookieparser_initialize(&parser);
+ if (err < 0) {
+ return err;
+ }
+ err = submitutil_setcookie(&parser, db, start, ptr - start, host, host_len, path, path_len, time);
+ setcookieparser_finalize(&parser);
+ if (err < 0) {
+ return err;
+ }
+ }
+
+ return 0;
+}
+
+LOCAL W submitutil_makecookieheader2(UB **str, W *len, cookiedb_t *cdb, UB *host, W host_len, UB *path, W path_len, STIME time)
+{
+ cookiedb_writeheadercontext_t *ctx;
+ Bool cont;
+ UB *cstr;
+ W cstr_len, err;
+
+ ctx = cookiedb_startheaderwrite(cdb, host, host_len, path, path_len, False, time);
+ if (ctx == NULL) {
+ return -1; /* TODO */
+ }
+
+ err = 0;
+ for (;;) {
+ cont = cookiedb_writeheadercontext_makeheader(ctx, &cstr, &cstr_len);
+ if (cont == False) {
+ break;
+ }
+
+ err = sjstring_appendasciistring(str, len, cstr, cstr_len);
+ if (err < 0) {
+ break;
+ }
+ }
+ cookiedb_endheaderwrite(cdb, ctx);
+
+ return err;
+}
+
+EXPORT W submitutil_makeheaderstring2(UB *host, W host_len, UB *board, W board_len, UB *thread, W thread_len, W content_length, STIME time, cookiedb_t *cdb, UB **header, W *header_len)
+{
+ UB *str = NULL;
+ W len = 0;
+ W err;
+
+ MAKEHEADER_ERR(&str, &len, "POST /test/bbs.cgi HTTP/1.1\r\n");
+ MAKEHEADER_ERR(&str, &len, "Host: ");
+ MAKEHEADER_ERR_LEN(&str, &len, host, host_len);
+ MAKEHEADER_ERR(&str, &len, "\r\n");
+ MAKEHEADER_ERR(&str, &len, "Accept: */*\r\n");
+ MAKEHEADER_ERR(&str, &len, "Referer: http://");
+ MAKEHEADER_ERR_LEN(&str, &len, host, host_len);
+ MAKEHEADER_ERR(&str, &len, "/test/read.cgi/");
+ MAKEHEADER_ERR_LEN(&str, &len, board, board_len);
+ MAKEHEADER_ERR(&str, &len, "/");
+ MAKEHEADER_ERR_LEN(&str, &len, thread, thread_len);
+ MAKEHEADER_ERR(&str, &len, "/\r\n");
+ MAKEHEADER_ERR(&str, &len, "Content-Length: ");
+ MAKEHEADER_NUM_ERR(&str, &len, content_length);
+ MAKEHEADER_ERR(&str, &len, "\r\n");
+ err = submitutil_makecookieheader2(&str, &len, cdb, host, host_len, "/test/bbs.cgi", strlen("/test/bbs.cgi"), time);
+ if (err < 0) {
+ return err;
+ }
+ MAKEHEADER_ERR(&str, &len, "Content-Type: application/x-www-form-urlencoded\r\n");
+ MAKEHEADER_ERR(&str, &len, "Accept-Language: ja\r\nUser-Agent: Monazilla/1.00 (bchan/0.201)\r\nConnection: close\r\n\r\n");
+
+ *header = str;
+ *header_len = len;
+
+ return 0;
+}
+
+
LOCAL UB* submitutil_makeerrormessage_search_b_elm(UB *body, W body_len)
{
UB *ptr;
/*
* test_submitutil.c
*
- * Copyright (c) 2010 project bchan
+ * Copyright (c) 2010-2011 project bchan
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
#include <bstdio.h>
#include <bstring.h>
#include <bstdlib.h>
+#include <tcode.h>
#include "test.h"
#include "submitutil.h"
+#define TEST_SUBMITUTIL_SAMPLE_RECTYPE 30
+#define TEST_SUBMITUTIL_SAMPLE_SUBTYPE 1
+
+/* TODO: share with test_cookiedb.c */
+LOCAL W test_util_gen_file(LINK *lnk)
+{
+ LINK lnk0;
+ W fd, err;
+ TC name[] = {TK_t, TNULL};
+
+ err = get_lnk(NULL, &lnk0, F_NORM);
+ if (err < 0) {
+ return err;
+ }
+ err = cre_fil(&lnk0, name, NULL, 0, F_FLOAT);
+ if (err < 0) {
+ return err;
+ }
+ fd = err;
+
+ *lnk = lnk0;
+
+ return fd;
+}
+
/* with <!-- 2ch_X:true --> */
LOCAL UB test_checkresponse_true_01[] = {
0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x61,
return TEST_RESULT_PASS;
}
+LOCAL TEST_RESULT test_makenextrequestheader_2()
+{
+ UB expected_cookie[] = "Cookie: PON=xxxxx.yyyy.zzzz.ad.jp; HAP=XYZABCD;";
+ UB host[] = "dummy.test.net";
+ UB board[] = "dummyborad";
+ UB thread[] = "0123456789";
+ W content_length = 227;
+ UB *next = NULL;
+ W next_len;
+ W err, fd;
+ UB *found;
+ cookiedb_t *db;
+ LINK test_lnk;
+
+ fd = test_util_gen_file(&test_lnk);
+ if (fd < 0) {
+ return TEST_RESULT_FAIL;
+ }
+ cls_fil(fd);
+ db = cookiedb_new(&test_lnk, TEST_SUBMITUTIL_SAMPLE_RECTYPE, TEST_SUBMITUTIL_SAMPLE_SUBTYPE);
+ if (db == NULL) {
+ del_fil(NULL, &test_lnk, 0);
+ return TEST_RESULT_FAIL;
+ }
+
+ err = submitutil_updatecookiedb(db, test_makenextrequestheader_01, strlen(test_makenextrequestheader_01), host, strlen(host), 0x3a000000);
+ if (err < 0) {
+ cookiedb_delete(db);
+ del_fil(NULL, &test_lnk, 0);
+ return TEST_RESULT_FAIL;
+ }
+ err = submitutil_makeheaderstring2(host, strlen(host), board, strlen(board), thread, strlen(thread), content_length, 0x3a000000, db, &next, &next_len);
+
+ cookiedb_delete(db);
+ del_fil(NULL, &test_lnk, 0);
+
+ if (err < 0) {
+ return TEST_RESULT_FAIL;
+ }
+ if (next == NULL) {
+ return TEST_RESULT_FAIL;
+ }
+
+ found = strstr(next, expected_cookie);
+ if (found == NULL) {
+ free(next);
+ return TEST_RESULT_FAIL;
+ }
+ if (found[-2] != '\r') {
+ free(next);
+ return TEST_RESULT_FAIL;
+ }
+ if (found[-1] != '\n') {
+ free(next);
+ return TEST_RESULT_FAIL;
+ }
+ if (found[strlen(expected_cookie)] != '\r') {
+ free(next);
+ return TEST_RESULT_FAIL;
+ }
+ if (found[strlen(expected_cookie)+1] != '\n') {
+ free(next);
+ return TEST_RESULT_FAIL;
+ }
+ free(next);
+ return TEST_RESULT_PASS;
+}
+
/* error message */
/* ERROR:¤³¤Î¥¹¥ì¥Ã¥É¤Ë¤Ï½ñ¤¹þ¤á¤Þ¤»¤ó¡£ */
test_submituril_printresult(test_checkresponse_6, "test_checkresponse_6");
test_submituril_printresult(test_makenextrequestbody_1, "test_makenextrequestbody_1");
test_submituril_printresult(test_makenextrequestheader_1, "test_makenextrequestheader_1");
+ test_submituril_printresult(test_makenextrequestheader_2, "test_makenextrequestheader_2");
test_submituril_printresult(test_makeerrormessage_1, "test_makeerrormessage_1");
test_submituril_printresult(test_makeerrormessage_2, "test_makeerrormessage_2");
test_submituril_printresult(test_makeerrormessage_3, "test_makeerrormessage_3");