Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
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, "&nbsp;&nbsp;");
			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);
}
Exemplo n.º 5
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);
            }
        }
    }

}