1 /* Feel free to use this example code in any way 2 you see fit (Public Domain) */ 3 4 #include <sys/types.h> 5 #ifndef _WIN32 6 #include <sys/select.h> 7 #include <sys/socket.h> 8 #else 9 #include <winsock2.h> 10 #endif 11 #include <microhttpd.h> 12 #include <time.h> 13 #include <sys/stat.h> 14 #include <fcntl.h> 15 #include <string.h> 16 #include <stdio.h> 17 18 #define PORT 8888 19 #define FILENAME "picture.png" 20 #define MIMETYPE "image/png" 21 22 static int 23 answer_to_connection (void *cls, struct MHD_Connection *connection, 24 const char *url, const char *method, 25 const char *version, const char *upload_data, 26 size_t *upload_data_size, void **con_cls) 27 { 28 struct MHD_Response *response; 29 int fd; 30 int ret; 31 struct stat sbuf; 32 33 if (0 != strcmp (method, "GET")) 34 return MHD_NO; 35 36 if ( (-1 == (fd = open (FILENAME, O_RDONLY))) || 37 (0 != fstat (fd, &sbuf)) ) 38 { 39 /* error accessing file */ 40 if (fd != -1) 41 (void) close (fd); 42 const char *errorstr = 43 "<html><body>An internal server error has occured!\ 44 </body></html>"; 45 response = 46 MHD_create_response_from_buffer (strlen (errorstr), 47 (void *) errorstr, 48 MHD_RESPMEM_PERSISTENT); 49 if (NULL != response) 50 { 51 ret = 52 MHD_queue_response (connection, MHD_HTTP_INTERNAL_SERVER_ERROR, 53 response); 54 MHD_destroy_response (response); 55 56 return ret; 57 } 58 else 59 return MHD_NO; 60 } 61 response = 62 MHD_create_response_from_fd_at_offset (sbuf.st_size, fd, 0); 63 MHD_add_response_header (response, "Content-Type", MIMETYPE); 64 ret = MHD_queue_response (connection, MHD_HTTP_OK, response); 65 MHD_destroy_response (response); 66 67 return ret; 68 } 69 70 71 int 72 main () 73 { 74 struct MHD_Daemon *daemon; 75 76 daemon = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY, PORT, NULL, NULL, 77 &answer_to_connection, NULL, MHD_OPTION_END); 78 if (NULL == daemon) 79 return 1; 80 81 (void) getchar (); 82 83 MHD_stop_daemon (daemon); 84 85 return 0; 86 } 87