aboutsummaryrefslogtreecommitdiff
path: root/response_generation_sendfile.c
blob: c94ed964e3c0a4b5cb6c5af2a8c5973573048e11 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
 * response generation using sendfile():
 * make sure that after the last write operation the
 * packet is sent without corking, no unnecessary setsockopts
 */

#include <microhttpd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>

static int
answer_to_connection (void *cls,
		      struct MHD_Connection *connection,
		      const char *url,
		      const char *method,
		      const char *version,
		      const char *upload_data,
		      size_t *upload_data_size,
		      void **con_cls)
{
	struct stat buf;
	struct MHD_Response *response;
	int ret;
	int fd;
	if ((0 != strcmp (method, MHD_HTTP_METHOD_GET)) &&
	    (0 != strcmp (method, MHD_HTTP_METHOD_HEAD)))
		return MHD_NO;
	if ((-1 == (fd = open ("a.txt", O_RDONLY))) || (0 != fstat (fd, &buf)))
	{
		if (fd != -1)
			close (fd);
		return 1; // error
	}
	response = MHD_create_response_from_fd64 (buf.st_size, fd);
	if (NULL == response)
	{
		if (0 != close (fd))
			abort ();
		return MHD_NO;
	}
	ret = MHD_queue_response (connection, MHD_HTTP_OK, response);
	MHD_destroy_response (response);
	if (MHD_NO == ret)
		abort ();
	return ret;
}

int
main (void)
{
	struct MHD_Daemon *daemon;
	daemon =
	    MHD_start_daemon (MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD |
				  MHD_USE_ERROR_LOG,
			      8888,
			      NULL,
			      NULL,
			      &answer_to_connection,
			      NULL,
			      NULL,
			      MHD_OPTION_END);
	if (NULL == daemon)
		return 1;
	(void) getchar ();
	MHD_stop_daemon (daemon);
	return 0;
}