Query parser

FossilOrigin-Name: fb3dec10d90e0beac45bcef20f4f0b7ba9fcc1a446d602e4484a0d0fa5a9e856
This commit is contained in:
me@ow.nekobit.net 2022-02-01 03:10:09 +00:00
parent 9041c53b24
commit 31efb281a4
7 changed files with 150 additions and 9 deletions

22
src/cookie.h Normal file
View file

@ -0,0 +1,22 @@
/*
* RatFE - Lightweight frontend for Pleroma
* Copyright (C) 2022 Nekobit
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef COOKIE_H
#define COOKIE_H
#endif // COOKIE_H

View file

@ -17,8 +17,12 @@
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "../config.h"
#include "page_config.h"
#include "query.h"
// Pages
#include "../static/index.chtml"
@ -27,9 +31,45 @@
void content_config(mastodont_t* api)
{
(void)api; // No need to use this
/* Output */
char* request_method = getenv("REQUEST_METHOD");
char* post_query, * p_query_read;
struct http_query_info info;
// Output
printf("Content-Length: %ld\r\n\r\n",
data_index_html_size + data_config_html_size);
// Handle POST
if (request_method && (strcmp("POST", request_method) == 0))
{
int content_length = atoi(getenv("CONTENT_LENGTH"));
post_query = malloc(content_length + 1);
if (!post_query)
{
puts("Malloc error!");
return;
}
read(STDIN_FILENO, post_query, content_length);
post_query[content_length] = '\0';
// For parse_query to shift through, so we can still free the original
p_query_read = post_query;
// Parse
while (1)
{
p_query_read = parse_query(p_query_read, &info);
printf("%.*s,", (int)info.val_len, info.val);
if (p_query_read == NULL)
break;
}
// Cleanup
free(post_query);
}
printf(data_index_html, config_canonical_name, data_config_html);
}

View file

@ -19,6 +19,7 @@
#include <string.h>
#include <stdlib.h>
#include "path.h"
#include "index.h"
void handle_paths(mastodont_t* api, struct path_info* paths, size_t paths_len)
{
@ -28,11 +29,11 @@ void handle_paths(mastodont_t* api, struct path_info* paths, size_t paths_len)
{
content_index(api);
}
else if (path && path[1] == '@')
else if (path[1] == '@')
{ // Account path
content_index(api);
}
else if (path)
else
{ // Generic path
for (size_t i = 0; i < paths_len; ++i)
{

42
src/query.c Normal file
View file

@ -0,0 +1,42 @@
/*
* RatFE - Lightweight frontend for Pleroma
* Copyright (C) 2022 Nekobit
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "query.h"
char* parse_query(char* begin, struct http_query_info* info)
{
int end = 0;
char* val_begin;
info->key = begin;
for (; *begin != '&' && *begin != '\0'; ++begin)
{
if (*begin == '=')
{
val_begin = begin+1;
*begin = '\0';
}
}
if (*begin == '\0') end = 1;
if (*begin == '&') *begin = '\0';
info->val = val_begin;
// The val length may be large, so strlen can waste time
info->val_len = (size_t)(begin - val_begin);
return end ? NULL : begin+1;
}

33
src/query.h Normal file
View file

@ -0,0 +1,33 @@
/*
* RatFE - Lightweight frontend for Pleroma
* Copyright (C) 2022 Nekobit
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef QUERY_H
#define QUERY_H
#include <stddef.h>
struct http_query_info
{
char* key;
char* val;
size_t val_len; // Val may be large, like CSS property
};
/* A stupidly quick query parser */
char* parse_query(char* begin, struct http_query_info* info);
#endif // QUERY_H

View file

@ -15,10 +15,6 @@
<input type="checkbox" id="cfgjslive" name="jslive">
<label for="cfgjslive">Live statuses - Statuses fetch on the fly</label>
</li>
<li>
<input type="checkbox" id="cfgjsreply" name="jsreply">
<label for="cfgjsreply">Quick reply - Replies don't require redirects</label>
</li>
</ul>
<!-- Appearance -->
@ -44,5 +40,7 @@
<label for="cfgdark">Dark</label>
</li>
</ul>
<input type="submit" value="Save">
</form>
</div>

View file

@ -26,10 +26,15 @@
<aside id="leftbar">
<ul>
<li><a class="sidebarbtn" href="#">Home</a></li>
<li><a class="sidebarbtn" href="#">Notifications</a></li>
<li><a class="sidebarbtn" href="#">Local</a></li>
<li><a class="sidebarbtn" href="#">Federated</a></li>
</ul>
<ul>
<li><a class="sidebarbtn" href="#">Notifications</a></li>
<li><a class="sidebarbtn" href="#">Lists</a></li>
<li><a class="sidebarbtn" href="#">Direct</a></li>
</ul>
<ul>
<li><a class="sidebarbtn" href="/config">Config</a></li>
</ul>