ksgi
1/* $Id$ */
2/*
3* Copyright (c) 2015 Kristaps Dzonsons <kristaps@bsd.lv>
4*
5* Permission to use, copy, modify, and distribute this software for any
6* purpose with or without fee is hereby granted, provided that the above
7* copyright notice and this permission notice appear in all copies.
8*
9* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*/
17#include "../config.h"18
19#include <stdarg.h>20#include <stdint.h>21#include <stdlib.h>22#include <string.h>23#include <unistd.h>24
25#include <curl/curl.h>26
27#include "../kcgi.h"28#include "regress.h"29
30static size_t31doign(void *ptr, size_t sz, size_t nm, void *arg)32{
33
34*(size_t *)arg += sz * nm;35return(sz * nm);36}
37
38static int39parent(CURL *curl)40{
41char *p;42size_t i;43
44p = malloc(1024 * 1024 + 5);45strncpy(p, "tag=", 5);46for (i = 0; i < 1024 * 1024; i++)47p[i + 4] = (i % 10) + 65;48p[1024 * 1024 + 4] = '\0';49
50i = 0;51curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, doign);52curl_easy_setopt(curl, CURLOPT_WRITEDATA, &i);53curl_easy_setopt(curl, CURLOPT_POSTFIELDS, p);54curl_easy_setopt(curl, CURLOPT_URL,55"http://localhost:17123/");56if (CURLE_OK != curl_easy_perform(curl)) {57free(p);58return(0);59}60free(p);61return(i >= 1024 * 1024);62}
63
64static int65child(void)66{
67struct kreq r;68const char *page = "index";69struct kvalid valid = { NULL, "tag" };70size_t i;71
72if (KCGI_OK != khttp_parse(&r, &valid, 1, &page, 1, 0))73return(0);74
75if (NULL == r.fieldmap[0]) {76khttp_free(&r);77return(0);78} else if (1024 * 1024 != r.fieldmap[0]->valsz) {79khttp_free(&r);80return(0);81}82
83for (i = 0; i < 1024 * 1024; i++)84if (r.fieldmap[0]->val[i] != (char)(i % 10) + 65) {85khttp_free(&r);86return(0);87}88
89khttp_head(&r, kresps[KRESP_STATUS],90"%s", khttps[KHTTP_200]);91khttp_head(&r, kresps[KRESP_CONTENT_TYPE],92"%s", kmimetypes[KMIME_TEXT_HTML]);93khttp_body(&r);94khttp_write(&r, r.fieldmap[0]->val, r.fieldmap[0]->valsz);95khttp_free(&r);96return(1);97}
98
99int
100main(int argc, char *argv[])101{
102
103return(regress_cgi(parent, child) ? EXIT_SUCCESS : EXIT_FAILURE);104}
105