4 * Copyright (c) 2010 project bchan
6 * This software is provided 'as-is', without any express or implied
7 * warranty. In no event will the authors be held liable for any damages
8 * arising from the use of this software.
10 * Permission is granted to anyone to use this software for any purpose,
11 * including commercial applications, and to alter it and redistribute it
12 * freely, subject to the following restrictions:
14 * 1. The origin of this software must not be misrepresented; you must not
15 * claim that you wrote the original software. If you use this software
16 * in a product, an acknowledgment in the product documentation would be
17 * appreciated but is not required.
19 * 2. Altered source versions must be plainly marked as such, and must not be
20 * misrepresented as being the original software.
22 * 3. This notice may not be removed or altered from any source
31 #include "submitutil.h"
32 #include "sjisstring.h"
35 #define MAKEHEADER_ERR_LEN(dest, dest_len, src, len) \
36 err = sjstring_appendasciistring(dest, dest_len, src, len); \
41 #define MAKEHEADER_ERR(dest, dest_len, src) MAKEHEADER_ERR_LEN(dest, dest_len, (src), strlen((src)))
43 #define MAKEHEADER_NUM_ERR(dest, dest_len, num) \
44 err = sjstring_appendUWstring(dest, dest_len, num); \
49 EXPORT W submitutil_makeheaderstring(UB *host, W host_len, UB *board, W board_len, UB *thread, W thread_len, W content_length, UB **header, W *header_len)
55 MAKEHEADER_ERR(&str, &len, "POST /test/bbs.cgi HTTP/1.1\r\n");
56 MAKEHEADER_ERR(&str, &len, "Host: ");
57 MAKEHEADER_ERR_LEN(&str, &len, host, host_len);
58 MAKEHEADER_ERR(&str, &len, "\r\n");
59 MAKEHEADER_ERR(&str, &len, "Accept: */*\r\n");
60 MAKEHEADER_ERR(&str, &len, "Referer: http://");
61 MAKEHEADER_ERR_LEN(&str, &len, host, host_len);
62 MAKEHEADER_ERR(&str, &len, "/test/read.cgi/");
63 MAKEHEADER_ERR_LEN(&str, &len, board, board_len);
64 MAKEHEADER_ERR(&str, &len, "/");
65 MAKEHEADER_ERR_LEN(&str, &len, thread, thread_len);
66 MAKEHEADER_ERR(&str, &len, "/\r\n");
67 MAKEHEADER_ERR(&str, &len, "Content-Length: ");
68 MAKEHEADER_NUM_ERR(&str, &len, content_length);
69 MAKEHEADER_ERR(&str, &len, "\r\n");
70 MAKEHEADER_ERR(&str, &len, "Content-Type: application/x-www-form-urlencoded\r\n");
71 MAKEHEADER_ERR(&str, &len, "Accept-Language: ja\r\nUser-Agent: Monazilla/1.00 (bchan/0.01)\r\nConnection: close\r\n\r\n");
79 EXPORT submitutil_poststatus_t submitutil_checkresponse(UB *body, W len)
82 UB *ptr, *title_last, *found;
83 UB title_true[] = {0x82, 0xdc, 0x82, 0xb5, 0x82, 0xbd, '\0'};
84 UB title_error[] = {0x82, 0x64, 0x82, 0x71, 0x82, 0x71, '\0'};
85 UB title_cookie[] = {0x8a, 0x6d, 0x94, 0x46, '\0'};
86 UB title_ocha[] = {0x82, 0xa8, 0x92, 0x83, '\0'};
90 ptr = strstr(ptr, "<!--");
95 for (;ptr < body + len;ptr++) {
100 cmp = strcmp(ptr, "2ch_X:true");
102 return submitutil_poststatus_true;
104 cmp = strcmp(ptr, "2ch_X:false");
106 return submitutil_poststatus_false;
108 cmp = strcmp(ptr, "2ch_X:error");
110 return submitutil_poststatus_error;
112 cmp = strcmp(ptr, "2ch_X:check");
114 return submitutil_poststatus_check;
116 cmp = strcmp(ptr, "2ch_X:cookie");
118 return submitutil_poststatus_cookie;
122 for (ptr = body;ptr < body + len; ptr++) {
124 cmp = strncasecmp(ptr, "<title>", 7);
129 title_last = strstr(ptr, "</");
130 if (title_last == NULL) {
131 return submitutil_poststatus_notfound;
133 found = strstr(ptr, title_true);
134 if ((found != NULL)&&(found < title_last)) {
135 return submitutil_poststatus_true;
137 found = strstr(ptr, title_error);
138 if ((found != NULL)&&(found < title_last)) {
139 return submitutil_poststatus_error;
141 found = strstr(ptr, title_cookie);
142 if ((found != NULL)&&(found < title_last)) {
143 return submitutil_poststatus_cookie;
145 found = strstr(ptr, title_ocha);
146 if ((found != NULL)&&(found < title_last)) {
147 return submitutil_poststatus_error;
152 return submitutil_poststatus_notfound;
155 #ifdef BCHAN_CONFIG_DEBUG
156 EXPORT VOID submitutil_poststatus_debugprint(submitutil_poststatus_t status)
159 case submitutil_poststatus_notfound:
160 printf("submitutil_poststatus_notfound\n");
162 case submitutil_poststatus_true:
163 printf("submitutil_poststatus_true\n");
165 case submitutil_poststatus_false:
166 printf("submitutil_poststatus_false\n");
168 case submitutil_poststatus_error:
169 printf("submitutil_poststatus_error\n");
171 case submitutil_poststatus_check:
172 printf("submitutil_poststatus_check\n");
174 case submitutil_poststatus_cookie:
175 printf("submitutil_poststatus_cookie\n");
181 LOCAL W submitutil_appendstring_chref_before_urlencode(UB **dest, W *dlen, UB *src, W slen)
183 charreferparser_t parser;
184 charreferparser_result_t result;
186 W i, rem_len, ch_w, err;
192 amp = sjstring_searchchar(rem, rem_len, '&');
194 return sjstring_appendurlencodestring(dest, dlen, rem, rem_len);
196 err = sjstring_appendurlencodestring(dest, dlen, rem, amp - rem);
201 rem_len -= amp - rem;
203 err = charreferparser_initialize(&parser);
207 for (i = 0; i < rem_len; i++) {
208 result = charreferparser_parsechar(&parser, amp[i]);
209 if (result == CHARREFERPARSER_RESULT_DETERMINE) {
210 ch_w = charreferparser_getcharnumber(&parser);
211 if ((ch_w >= 0)&&(ch_w < 256)) {
213 if (ch_b == 0x0a) { /* need more check ? */
215 err = sjstring_appendurlencodestring(dest, dlen, &ch_b2, 1);
220 err = sjstring_appendurlencodestring(dest, dlen, &ch_b, 1);
225 err = sjstring_appendurlencodestring(dest, dlen, amp, i+1);
233 if (result == CHARREFERPARSER_RESULT_INVALID) {
237 charreferparser_finalize(&parser);
250 EXPORT W submitutil_makenextrequestbody(UB *prev_body, W prev_body_len, UB **next_body, W *next_len)
254 UB *name = NULL, *value = NULL;
255 W name_len = 0, value_len = 0;
260 for (ptr = prev_body; ptr < prev_body + prev_body_len;) {
261 ptr = strstr(ptr, "<input ");
269 for (;ptr < prev_body + prev_body_len;) {
270 for (;ptr < prev_body + prev_body_len;ptr++) {
276 if ((name == NULL)||(name_len == 0)) {
280 err = sjstring_appendasciistring(&newbody, &newbody_len, "&", 1);
286 err = sjstring_appendasciistring(&newbody, &newbody_len, name, name_len);
290 sjstring_appendasciistring(&newbody, &newbody_len, "=", 1);
294 err = submitutil_appendstring_chref_before_urlencode(&newbody, &newbody_len, value, value_len);
300 /* check attribute */
301 if (strncasecmp(ptr, "name=\"", 6) == 0) {
304 for (;ptr < prev_body + prev_body_len;ptr++) {
309 name_len = ptr - name;
311 } else if (strncasecmp(ptr, "name=", 5) == 0) {
314 for (;ptr < prev_body + prev_body_len;ptr++) {
315 if ((*ptr == ' ')||(*ptr == '>')) {
319 name_len = ptr - name;
320 } else if (strncasecmp(ptr, "value=\"", 7) == 0) {
323 for (;ptr < prev_body + prev_body_len;ptr++) {
328 value_len = ptr - value;
330 } else if (strncasecmp(ptr, "value=", 6) == 0) {
333 for (;ptr < prev_body + prev_body_len;ptr++) {
334 if ((*ptr == ' ')||(*ptr == '>')) {
338 value_len = ptr - value;
341 for (;ptr < prev_body + prev_body_len;ptr++) {
350 *next_body = newbody;
351 *next_len = newbody_len;
356 LOCAL W submitutil_makecookieheader(UB **str, W *len, UB *prev_header, W prev_header_len)
362 for (ptr = prev_header; ptr < prev_header + prev_header_len;) {
363 ptr = strstr(ptr, "Set-Cookie:");
368 for (;ptr < prev_header + prev_header_len; ptr++) {
374 for (;ptr < prev_header + prev_header_len; ptr++) {
379 cookie_len = ptr + 1 - start;
381 MAKEHEADER_ERR(str, len, "Cookie: ");
384 MAKEHEADER_ERR(str, len, " ");
386 MAKEHEADER_ERR_LEN(str, len, start, cookie_len);
389 if (first == False) {
390 MAKEHEADER_ERR(str, len, "\r\n");
396 EXPORT 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)
402 MAKEHEADER_ERR(&str, &len, "POST /test/bbs.cgi HTTP/1.1\r\n");
403 MAKEHEADER_ERR(&str, &len, "Host: ");
404 MAKEHEADER_ERR_LEN(&str, &len, host, host_len);
405 MAKEHEADER_ERR(&str, &len, "\r\n");
406 MAKEHEADER_ERR(&str, &len, "Accept: */*\r\n");
407 MAKEHEADER_ERR(&str, &len, "Referer: http://");
408 MAKEHEADER_ERR_LEN(&str, &len, host, host_len);
409 MAKEHEADER_ERR(&str, &len, "/test/read.cgi/");
410 MAKEHEADER_ERR_LEN(&str, &len, board, board_len);
411 MAKEHEADER_ERR(&str, &len, "/");
412 MAKEHEADER_ERR_LEN(&str, &len, thread, thread_len);
413 MAKEHEADER_ERR(&str, &len, "/\r\n");
414 MAKEHEADER_ERR(&str, &len, "Content-Length: ");
415 MAKEHEADER_NUM_ERR(&str, &len, content_length);
416 MAKEHEADER_ERR(&str, &len, "\r\n");
417 err = submitutil_makecookieheader(&str, &len, prev_header, prev_header_len);
421 MAKEHEADER_ERR(&str, &len, "Content-Type: application/x-www-form-urlencoded\r\n");
422 MAKEHEADER_ERR(&str, &len, "Accept-Language: ja\r\nUser-Agent: Monazilla/1.00\r\nConnection: close\r\n\r\n");