ksgi

Форк
0
/
test-fcgi-upload.c 
172 строки · 5.0 Кб
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 <sys/stat.h>
20

21
#include <stdarg.h>
22
#include <stdint.h>
23
#include <stdlib.h>
24
#include <string.h>
25
#include <unistd.h>
26

27
#include <curl/curl.h>
28

29
#include "../kcgi.h"
30
#include "regress.h"
31

32
static int
33
parent(CURL *curl)
34
{
35
	struct curl_httppost	*post, *last;
36
	char 		 	 namebuffer[] = "name buffer";
37
	size_t			 namelength, htmlbufferlength, record_length;
38
	char 			 buffer[] = "test buffer";
39
	char 			 htmlbuffer[] = "<HTML>test buffer</HTML>";
40
	struct curl_forms 	 forms[3];
41
	char 			 file1[] = "kcgi.c";
42
	char 			 file2[] = "kcgi.h";
43
	char 			 record[] = "asdfasdf";
44
	int			 rc;
45

46
	/* 
47
	 * Add null character into htmlbuffer, to demonstrate that
48
	 * transfers of buffers containing null characters actually
49
	 * work.
50
	 */
51
	namelength = strlen(namebuffer);
52
	htmlbufferlength = strlen(htmlbuffer);
53
	record_length = strlen(htmlbuffer);
54
	htmlbuffer[8] = '\0';
55
	post = last = NULL;
56

57
	/* Add simple name/content section */  
58
	curl_formadd(&post, &last, CURLFORM_COPYNAME, 
59
		"name", CURLFORM_COPYCONTENTS, "content", CURLFORM_END);
60

61
	/* Add simple name/content/contenttype section */  
62
	curl_formadd(&post, &last, CURLFORM_COPYNAME, 
63
		"htmlcode", CURLFORM_COPYCONTENTS, "<HTML></HTML>",  
64
		CURLFORM_CONTENTTYPE, "text/html", CURLFORM_END); 
65

66
	/* Add name/ptrcontent section */
67
	curl_formadd(&post, &last, CURLFORM_COPYNAME, 
68
		"name_for_ptrcontent", CURLFORM_PTRCONTENTS, 
69
		buffer, CURLFORM_END);
70

71
	/* Add ptrname/ptrcontent section */
72
	curl_formadd(&post, &last, CURLFORM_PTRNAME, 
73
		namebuffer, CURLFORM_PTRCONTENTS, buffer, 
74
		CURLFORM_NAMELENGTH, namelength, CURLFORM_END);
75

76
	/* Add name/ptrcontent/contenttype section */
77
	curl_formadd(&post, &last, CURLFORM_COPYNAME, 
78
		"html_code_with_hole", CURLFORM_PTRCONTENTS, 
79
		htmlbuffer, CURLFORM_CONTENTSLENGTH, 
80
		htmlbufferlength, CURLFORM_CONTENTTYPE, 
81
		"text/html", CURLFORM_END); 
82

83
	/* Add simple file section */  
84
	curl_formadd(&post, &last, CURLFORM_COPYNAME, 
85
		"picture", CURLFORM_FILE, "kcgi.c", 
86
		CURLFORM_END);
87

88
	 /* Add file/contenttype section */
89
	curl_formadd(&post, &last, CURLFORM_COPYNAME, 
90
		"picture", CURLFORM_FILE, "kcgi.c",
91
		CURLFORM_CONTENTTYPE, "text/x-c", CURLFORM_END); 
92

93
	/* Add two file section */  
94
	curl_formadd(&post, &last, CURLFORM_COPYNAME, 
95
		"pictures", CURLFORM_FILE, "kcgi.c", 
96
		CURLFORM_FILE, "kcgi.h", CURLFORM_END);
97

98
	/* Add two file section using CURLFORM_ARRAY */
99
	forms[0].option = CURLFORM_FILE;
100
	forms[0].value = file1;
101
	forms[1].option = CURLFORM_FILE;
102
	forms[1].value = file2;
103
	forms[2].option = CURLFORM_END; 
104

105
	/* Add a buffer to upload */
106
	curl_formadd(&post, &last, CURLFORM_COPYNAME, 
107
		"name", CURLFORM_BUFFER, "data", 
108
		CURLFORM_BUFFERPTR, record, 
109
		CURLFORM_BUFFERLENGTH, record_length, CURLFORM_END);
110

111
	/* no option needed for the end marker */
112
	curl_formadd(&post, &last, CURLFORM_COPYNAME, "pictures",
113
		CURLFORM_ARRAY, forms, CURLFORM_END);
114

115
	/* Add the content of a file as a normal post text value */
116
	curl_formadd(&post, &last, CURLFORM_COPYNAME, "filecontent", 
117
		CURLFORM_FILECONTENT, "Makefile", CURLFORM_END);
118

119
	/* Set the form info */
120
	curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
121
	curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
122
	curl_easy_setopt(curl, CURLOPT_URL, 
123
		"http://localhost:17123/");
124
	rc = curl_easy_perform(curl);
125
	curl_formfree(post);
126
	return(CURLE_OK == rc);
127
}
128

129
static int
130
child(void)
131
{
132
	struct kreq	 r;
133
	const char 	*page = "index";
134
	struct kfcgi	*fcgi;
135
	enum kcgi_err	 er;
136
	size_t		 i;
137
	struct stat	 st;
138

139
	if (KCGI_OK != khttp_fcgi_init(&fcgi, NULL, 0, &page, 1, 0))
140
		return(0);
141

142
	while (KCGI_OK == (er = khttp_fcgi_parse(fcgi, &r))) {
143
		khttp_head(&r, kresps[KRESP_STATUS], 
144
			"%s", khttps[KHTTP_200]);
145
		khttp_head(&r, kresps[KRESP_CONTENT_TYPE], 
146
			"%s", kmimetypes[KMIME_TEXT_HTML]);
147
		khttp_body(&r);
148
		for (i = 0; i < r.fieldsz; i++) {
149
			if (strcmp(r.fields[i].key, "picture"))
150
				continue;
151
			if (NULL == r.fields[i].file)
152
				return(0);
153
			if (-1 == stat(r.fields[i].file, &st)) {
154
				perror(r.fields[i].file);
155
				return(0);
156
			} else if ((size_t)st.st_size != r.fields[i].valsz) 
157
				return(0);
158
		}
159
		khttp_free(&r);
160
	}
161

162
	khttp_free(&r);
163
	khttp_fcgi_free(fcgi);
164
	return(KCGI_HUP == er ? 1 : 0);
165
}
166

167
int
168
main(int argc, char *argv[])
169
{
170

171
	return(regress_fcgi(parent, child) ? EXIT_SUCCESS : EXIT_FAILURE);
172
}
173

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.