void http_response_send_bigfile (HttpResponse *res, char *filename, char *content) /* ! basic, just read and copy file bit/bit */ { http_response_set_content_type(res, content); http_response_send_headers(res); unsigned char *data; FILE *fp=fopen(filename,"rb"); /* get file size and alloc memory */ fseek (fp , 0 , SEEK_END); unsigned long datasize = ftell(fp); rewind (fp); if (!(data = (unsigned char*)malloc(datasize))) exit(-1); /* copy */ while ( datasize-- ) fputc(fgetc(fp),stdout); fclose(fp); }
void http_response_send_smallfile (HttpResponse *res, char *filename, char *content, unsigned long sizelimit) /* ! file loaded in mem */ { unsigned char *data; FILE *fp=fopen(filename,"rb"); /* get file size and alloc memory */ fseek (fp , 0 , SEEK_END); unsigned long datasize = ftell(fp); if (datasize > sizelimit) exit(-1); rewind (fp); if (!(data = (unsigned char*)malloc(datasize))) exit(-1); /* load the file */ if (!fread(data, datasize, 1, fp)) exit(-1); http_response_set_content_type(res, content); http_response_set_data(res, data, datasize); http_response_send(res); fclose(fp); }
void wiki_show_changes_page_rss(HttpResponse *res) { WikiPageList **pages = NULL; int n_pages, i; pages = wiki_get_pages(&n_pages, NULL); http_response_set_content_type(res, "application/xhtml+xml"); http_response_printf(res, "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" "<rss version=\"2.0\">\n" "<channel><title>DidiWiki Changes feed</title>\n"); for (i = 0; i < n_pages; i++) { struct tm *pTm; char datebuf[64]; pTm = localtime(&pages[i]->mtime); strftime(datebuf, sizeof(datebuf), "%Y-%m-%d %H:%M", pTm); http_response_printf(res, "<item><title>%s</title>" "<link>%s%s</link><description>" "Modified %s\n", pages[i]->name, getenv("PORTABLEWIKI_URL_PREFIX") ? getenv("PORTABLEWIKI_URL_PREFIX") : "", pages[i]->name, datebuf); http_response_printf(res, "</description></item>\n"); } http_response_printf(res, "</channel>\n</rss>"); http_response_send(res); exit(0); }
void wiki_show_changes_page(HttpResponse *res) { WikiPageList **pages = NULL; int n_pages, i, j, m, lg; char spacing[24]; char *difflink; int *table, *done; //alloc mem with n_pages char *str_ptr; // wiki_show_header(res, "Changes", FALSE); pages = wiki_get_pages(&n_pages, NULL); table = malloc((1 + n_pages) * sizeof(int)); done = malloc((1 + n_pages) * sizeof(int)); http_response_set_content_type(res, "text/html"); /* regroup file and previous file */ for (i = 0; i < n_pages + 1; i++) { done[i] = 0; table[i] = 0; } m = 0; for (i = 0; i < n_pages; i++) if (!done[i] && !strstr(pages[i]->name, ".prev.1")) { for (j = 0; j < n_pages; j++) if (!done[j] && (str_ptr = strstr(pages[j]->name, pages[i]->name)) && !strcmp(str_ptr + strlen(pages[i]->name), ".prev.1")) { table[m++] = i; table[m++] = j; done[i] = 1; done[j] = 1; break; } } /* complete with new files */ for (i = 0; i < n_pages; i++) if (!done[i]) table[m++] = i; for (j = 0; j < m; j++) { struct tm *pTm; char datebuf[64]; i = table[j]; if (strstr(pages[i]->name, ".prev.1")) { strcpy(spacing, " "); lg = asprintf(&difflink, "<a href='/#/Diff/%s'>diff</a>\n" "<a href='/#/Comp/%s'>comp</a>\n", pages[i]->name, pages[i]->name); } else { *spacing = '\0'; difflink = strdup("\0"); } pTm = localtime(&pages[i]->mtime); strftime(datebuf, sizeof(datebuf), "%Y-%m-%d %H:%M", pTm); http_response_printf(res, "%s<a href=/#/View/%s>%s</a> %s %s<br />\n", spacing, pages[i]->name, pages[i]->name, datebuf, difflink); } http_response_printf(res, "<p>Wiki changes are also available as a " "<a href='/rss'>RSS</a> feed.\n"); // wiki_show_footer(res); http_response_send(res); free(table); free(done); exit(0); }
void wiki_handle_http_request(HttpRequest *req) { HttpResponse *res = http_response_new(req); char *page = http_request_get_path_info(req); char *command = http_request_get_query_string(req); char *wikitext = ""; util_dehttpize(page); /* remove any encoding on the requested page name. */ if (!strcmp(page, "/")) { if (access("WikiHome", R_OK) != 0) wiki_redirect(res, "/WikiHome?create"); page = "/WikiHome"; } if (!strcmp(page, "/styles.css")) { /* Return CSS page */ http_response_set_content_type(res, "text/css"); http_response_printf(res, "%s", CssData); http_response_send(res); exit(0); } if (!strcmp(page, "/favicon.ico")) { /* Return favicon */ http_response_set_content_type(res, "image/ico"); http_response_set_data(res, FaviconData, FaviconDataLen); http_response_send(res); exit(0); } page = page + 1; /* skip slash */ if (!strncmp(page, "api/", 4)) { char *p; page += 4; for (p=page; *p != '\0'; p++) if (*p=='?') { *p ='\0'; break; } wiki_handle_rest_call(req, res, page); exit(0); } /* A little safety. issue a malformed request for any paths, * There shouldn't need to be any.. */ if (strchr(page, '/')) { http_response_set_status(res, 404, "Not Found"); http_response_printf(res, "<html><body>404 Not Found</body></html>\n"); http_response_send(res); exit(0); } if (!strcmp(page, "Changes")) { wiki_show_changes_page(res); } else if (!strcmp(page, "ChangesRss")) { wiki_show_changes_page_rss(res); } else if (!strcmp(page, "Search")) { wiki_show_search_results_page(res, http_request_param_get(req, "expr")); } else if (!strcmp(page, "Create")) { if ( (wikitext = http_request_param_get(req, "title")) != NULL) { /* create page and redirect */ wiki_redirect(res, http_request_param_get(req, "title")); } else { /* show create page form */ wiki_show_create_page(res); } } else { /* TODO: dont blindly write wikitext data to disk */ if ( (wikitext = http_request_param_get(req, "wikitext")) != NULL) { file_write(page, wikitext); } if (access(page, R_OK) == 0) /* page exists */ { wikitext = file_read(page); if (!strcmp(command, "edit")) { /* print edit page */ wiki_show_edit_page(res, wikitext, page); } else { wiki_show_page(res, wikitext, page); } } else { if (!strcmp(command, "create")) { wiki_show_edit_page(res, NULL, page); } else { char buf[1024]; snprintf(buf, 1024, "%s?create", page); wiki_redirect(res, buf); } } } }