Add simple form data pull parser, updates for submodules

master
teknomunk 1 year ago
parent f26f2c2e61
commit 4e351686f4

3
.gitmodules vendored

@ -4,3 +4,6 @@
[submodule "src/http_server"]
path = src/http_server
url = https://teknomunk@gitea.polaris-1.work/teknomunk/http_server.git
[submodule "tools/builder"]
path = tools/builder
url = https://teknomunk@gitea.polaris-1.work/teknomunk/builder.git

@ -1,12 +1,14 @@
#!/bin/bash
set -e
find src | egrep "\.template$" | while read FILE; do
ruby src/embed.rb "$FILE"
done
#ruby src/embed.rb
ruby src/build.rb --code src
ruby tools/builder/build.rb --code src
mv src.bin debug
cp debug release
strip release

@ -1,88 +0,0 @@
#!/usr/bin/ruby
require "digest/sha1"
FLAGS="-g -MP -MD -Os"
LDFLAGS = "-larchive"
#FLAGS="-g -MP -MD"
def cxx( code_base, filename )
hash = Digest::SHA1.hexdigest(filename)[0,8]
dir = File.dirname(filename)
base = "." + File.basename(filename)
basename = File.join(dir, base.gsub(/\.c$/,"") + "-" + hash )
rebuild_needed = $clean
if !File.exists?(obj_file=(basename + ".o"))
rebuild_needed = true
elsif !File.exists?(deps=(basename + ".deps"))
rebuild_needed = true
else
obj_file_mtime = File.mtime(obj_file)
if obj_file_mtime < File.mtime(filename)
rebuild_needed = true
else
File.read(deps).each_line {|line|
line = line.strip
if File.exists?(line)
if File.mtime(line) > obj_file_mtime
#puts "#{line} is forcing rebuild of #{filename}"
rebuild_needed = true
end
end
}
end
end
return unless rebuild_needed
puts "[CC] #{filename} => #{obj_file}"
if !system("gcc -c #{FLAGS} \"#{filename}\" -o \"#{obj_file}\" -Isrc/ -I #{code_base} -I./")
File.unlink( obj_file )
File.unlink( deps )
exit(1)
end
deps = File.read(basename+".d").strip.split("\n").select {|l|
!l.include?("tmp") \
&& !l.include?("include") \
&& l[0] != ' '
}.map {|l|
l[..-2]
}
File.open(basename+".deps","w") {|f|
deps.each {|d| f.puts d }
}
File.unlink(basename+".d")
cmd = "ar r #{code_base}.a \"#{obj_file}\""
#puts cmd
system(cmd)
return true
end
$clean = false
code_base = "src/"
ARGV.each_with_index {|arg,i|
case arg
when "clean"
$clean = true
%x( rm #{code_base}.a )
when "--code"
code_base = ARGV[i+1]
end
}
puts "Compiling #{code_base}"
files = %x( find "#{code_base}" -type f ).strip.split("\n").select {|f| /\.c$/ =~ f }
%x( ar cr #{code_base}.a )
files.each {|filename|
cxx( code_base, filename )
}
system("gcc #{code_base}.a -g -o #{code_base}.bin -rdynamic #{LDFLAGS}")

@ -1,4 +1,4 @@
#include "http_request.h"
#include "http_server/http_request.h"
#include "controller/mastodon_api.h"
bool route_asset( struct http_request* req )

@ -1,9 +1,11 @@
#include "mastodon_api.h"
#include "http_request.h"
#include "http_server/http_request.h"
#include <stdio.h>
#include <stdlib.h>
#include "form.h"
bool route_mastodon_api( struct http_request* req )
{
if( http_request_route( req, "apps" ) ) {
@ -11,15 +13,16 @@ bool route_mastodon_api( struct http_request* req )
FILE* data = http_request_get_request_data( req );
printf( "OAuth2 app\n" );
// http_request_get_header( "Content-Length" );
struct form_parser* fp = form_pull_parser_new( data );
if( !fp ) { return false; }
//while( -1 != getline( &line, &size, data ) ) {
char ch;
while( (ch = fgetc(data) ) != EOF ) {
printf( "%c", ch );
fflush(stdout);
char* key;
while( key = form_pull_parser_read_key( fp ) ) {
printf( "key: %s\n", key );
printf( "vakue: %s\n", form_pull_parser_read_value(fp) );
}
printf( "End of file\n" );
form_pull_parser_release(fp);
}
}
return false;

@ -0,0 +1,83 @@
#include "form.h"
#include <stdio.h>
#include <stdlib.h>
struct form_parser
{
FILE* f;
char* buffer;
int size;
int pos;
};
struct form_parser* form_pull_parser_new( FILE* f )
{
struct form_parser* fp = (struct form_parser*)malloc(sizeof(struct form_parser));
if( !fp ) { return NULL; }
fp->f = f;
fp->buffer = malloc(32);
fp->buffer[0] = '\0';
fp->size = 32;
fp->pos = 0;
return fp;
}
void form_pull_parser_release( struct form_parser* fp )
{
fclose(fp->f);
free(fp->buffer);
free(fp);
}
static void append_char( struct form_parser* fp, char ch )
{
if( fp->pos == fp->size - 1 ) {
fp->size += 32;
fp->buffer = realloc( fp->buffer, fp->size );
}
fp->buffer[ fp->pos ] = ch;
fp->buffer[ fp->pos+1 ] = '\0';
fp->pos += 1;
}
static char* read_item( struct form_parser* fp, char delim )
{
char ch;
char escape[3] = "00";
int tmp;
// Clear any existing data
fp->pos = 0;
fp->buffer[0] = '\0';
while( (ch=fgetc(fp->f)) != EOF ) {
if( ch == delim ) { break; }
if( ch == '%' ) {
escape[0] = fgetc(fp->f);
escape[1] = fgetc(fp->f);
sscanf(escape, "%02x",&tmp);
append_char( fp, tmp );
} else {
append_char( fp, ch );
}
}
if( fp->pos == 0 ) {
return NULL;
}
return fp->buffer;
}
char* form_pull_parser_read_key( struct form_parser* fp )
{
return read_item( fp, '=' );
}
char* form_pull_parser_read_value( struct form_parser* fp )
{
return read_item( fp, '&' );
}

@ -0,0 +1,12 @@
#pragma once
#include <stdio.h>
struct form_parser;
struct form_parser* form_pull_parser_new( FILE* f );
void form_pull_parser_release( struct form_parser* );
char* form_pull_parser_read_key( struct form_parser* fp );
char* form_pull_parser_read_value( struct form_parser* fp );

@ -1 +1 @@
Subproject commit 50565dcf4dfc56523eef0f381e6fc0fe44f48a52
Subproject commit ac013e14cae0f377356ef8a1ae002c465d53a306

@ -6,8 +6,8 @@
#include <signal.h>
#include "app_args.h"
#include "http_server.h"
#include "http_request.h"
#include "http_server/http_server.h"
#include "http_server/http_request.h"
#include "controller/main.h"

@ -0,0 +1 @@
Subproject commit 17ff36dbc17a82c629ee95952d888ea6c84b5d8d
Loading…
Cancel
Save