OSDN Git Service

implement using cookiedb_t for send res submit.
authorornse01 <ornse01@users.sourceforge.jp>
Thu, 5 May 2011 09:27:16 +0000 (09:27 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Thu, 5 May 2011 09:27:16 +0000 (09:27 +0000)
git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchan/trunk@258 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/submitutil.c
src/submitutil.h
src/test_submitutil.c

index c9151c6..19b9e3e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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
@@ -32,6 +32,8 @@
 #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); \
@@ -428,6 +430,217 @@ EXPORT W submitutil_makenextheader(UB *host, W host_len, UB *board, W board_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;
index e3682b5..fb98ee1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * submitutil.h
  *
- * 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
@@ -26,6 +26,8 @@
 
 #include       <basic.h>
 
+#include    "cookiedb.h"
+
 #ifndef __SUBMITUTIL_H__
 #define __SUBMITUTIL_H__
 
@@ -42,6 +44,8 @@ IMPORT W submitutil_makeheaderstring(UB *host, W host_len, UB *board, W board_le
 IMPORT submitutil_poststatus_t submitutil_checkresponse(UB *body, W len);
 IMPORT W submitutil_makenextrequestbody(UB *prev_body, W prev_body_len, UB **next_body, W *next_len);
 IMPORT W submitutil_makenextheader(UB *host, W host_len, UB *board, W board_len, UB *thread, W thread_len, W content_length, UB *prev_header, W prev_header_len, UB **header, W *header_len);
+IMPORT W submitutil_updatecookiedb(cookiedb_t *db, UB *prev_header, W prev_header_len, UB *host, W host_len, STIME time);
+IMPORT 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);
 IMPORT W submitutil_makeerrormessage(UB *body, W body_len, TC **msg, W *msg_len);
 
 #ifdef BCHAN_CONFIG_DEBUG
index f3207f9..4d37254 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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,
@@ -1339,6 +1365,74 @@ LOCAL TEST_RESULT test_makenextrequestheader_1()
        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:¤³¤Î¥¹¥ì¥Ã¥É¤Ë¤Ï½ñ¤­¹þ¤á¤Þ¤»¤ó¡£ */
@@ -1719,6 +1813,7 @@ EXPORT VOID test_submitutil_main()
        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");