feat(ltm): PoC paste pages
parent
11421dca74
commit
8c2a7a640d
6
Makefile
6
Makefile
|
@ -42,7 +42,11 @@ liblsm:
|
||||||
liblnm:
|
liblnm:
|
||||||
$(MAKE) -C lnm
|
$(MAKE) -C lnm
|
||||||
|
|
||||||
$(BIN): liblsm liblnm $(OBJS)
|
.PHONY: libltm
|
||||||
|
libltm:
|
||||||
|
$(MAKE) -C ltm
|
||||||
|
|
||||||
|
$(BIN): liblsm liblnm libltm $(OBJS)
|
||||||
$(CC) -o $@ $(OBJS) $(_LDFLAGS)
|
$(CC) -o $@ $(OBJS) $(_LDFLAGS)
|
||||||
|
|
||||||
$(BUILD_DIR)/$(SRC_DIR)/%.c.o: $(SRC_DIR)/%.c
|
$(BUILD_DIR)/$(SRC_DIR)/%.c.o: $(SRC_DIR)/%.c
|
||||||
|
|
|
@ -7,16 +7,16 @@ SRC_DIR = src
|
||||||
TEST_DIR = test
|
TEST_DIR = test
|
||||||
THIRDPARTY_DIR = thirdparty
|
THIRDPARTY_DIR = thirdparty
|
||||||
|
|
||||||
INC_DIRS = include $(THIRDPARTY_DIR)/include lsm/include lnm/include
|
INC_DIRS = include $(THIRDPARTY_DIR)/include lsm/include lnm/include ltm/include
|
||||||
LIBS = lsm lnm
|
LIBS = lsm lnm ltm
|
||||||
LIB_DIRS = ./lsm/build ./lnm/build
|
LIB_DIRS = ./lsm/build ./lnm/build ./ltm/build
|
||||||
|
|
||||||
# -MMD: generate a .d file for every source file. This file can be imported by
|
# -MMD: generate a .d file for every source file. This file can be imported by
|
||||||
# make and makes make aware that a header file has been changed, ensuring an
|
# make and makes make aware that a header file has been changed, ensuring an
|
||||||
# object file is also recompiled if only a header is changed.
|
# object file is also recompiled if only a header is changed.
|
||||||
# -MP: generate a dummy target for every header file (according to the docs it
|
# -MP: generate a dummy target for every header file (according to the docs it
|
||||||
# prevents some errors when removing header files)
|
# prevents some errors when removing header files)
|
||||||
CFLAGS ?= -MMD -MP -g
|
CFLAGS ?= -MMD -MP -g -Wall
|
||||||
|
|
||||||
# When compiling release builds, these flags are better
|
# When compiling release builds, these flags are better
|
||||||
# CLAGS = -O3
|
# CLAGS = -O3
|
||||||
|
|
|
@ -4,16 +4,21 @@
|
||||||
#include "lnm/common.h"
|
#include "lnm/common.h"
|
||||||
#include "lnm/http/loop.h"
|
#include "lnm/http/loop.h"
|
||||||
#include "lsm/store.h"
|
#include "lsm/store.h"
|
||||||
|
#include "ltm/template.h"
|
||||||
|
|
||||||
extern const char lander_key_charset[];
|
extern const char lander_key_charset[];
|
||||||
|
|
||||||
typedef struct lander_gctx {
|
typedef struct lander_gctx {
|
||||||
const char *data_dir;
|
const char *data_dir;
|
||||||
lsm_store *store;
|
lsm_store *store;
|
||||||
|
struct {
|
||||||
|
ltm_template *paste;
|
||||||
|
} templates;
|
||||||
} lander_gctx;
|
} lander_gctx;
|
||||||
|
|
||||||
typedef struct lander_ctx {
|
typedef struct lander_ctx {
|
||||||
lsm_entry_handle *entry;
|
lsm_entry_handle *entry;
|
||||||
|
ltm_instance *instance;
|
||||||
} lander_ctx;
|
} lander_ctx;
|
||||||
|
|
||||||
typedef enum lander_attr_type : uint8_t {
|
typedef enum lander_attr_type : uint8_t {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "lnm/common.h"
|
#include "lnm/common.h"
|
||||||
#include "lsm/store.h"
|
#include "lsm/store.h"
|
||||||
|
#include "ltm/template.h"
|
||||||
|
|
||||||
#include "lander.h"
|
#include "lander.h"
|
||||||
|
|
||||||
|
@ -29,6 +30,12 @@ void lander_ctx_reset(lander_ctx *ctx) {
|
||||||
|
|
||||||
ctx->entry = NULL;
|
ctx->entry = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx->instance != NULL) {
|
||||||
|
ltm_instance_free(ctx->instance);
|
||||||
|
|
||||||
|
ctx->instance = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lander_ctx_free(lander_ctx *ctx) { free(ctx); }
|
void lander_ctx_free(lander_ctx *ctx) { free(ctx); }
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "lsm/store.h"
|
#include "lsm/store.h"
|
||||||
|
|
||||||
#include "lander.h"
|
#include "lander.h"
|
||||||
|
#include "ltm/template.h"
|
||||||
|
|
||||||
static const char index_page[] =
|
static const char index_page[] =
|
||||||
"<!DOCTYPE html>\n"
|
"<!DOCTYPE html>\n"
|
||||||
|
@ -73,13 +74,38 @@ lnm_err lander_entry_data_streamer(uint64_t *written, char *buf,
|
||||||
return lnm_err_ok;
|
return lnm_err_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
lnm_http_step_err lander_get_paste(lnm_http_conn *conn) {
|
lnm_err lander_template_streamer(size_t *written, char *buf, lnm_http_conn *conn, uint64_t offset, uint64_t len) {
|
||||||
lnm_http_loop_ctx *ctx = conn->ctx;
|
lnm_http_loop_ctx *ctx = conn->ctx;
|
||||||
lander_ctx *c_ctx = ctx->c;
|
lander_ctx *c_ctx = ctx->c;
|
||||||
|
|
||||||
lnm_http_res_body_set_fn(&ctx->res, lander_entry_data_streamer,
|
// TODO respect offset variable
|
||||||
lsm_entry_data_len(c_ctx->entry));
|
|
||||||
lnm_http_res_add_header(&ctx->res, lnm_http_header_content_type, "text/plain",
|
ltm_instance_write(written, buf, len, c_ctx->instance);
|
||||||
|
|
||||||
|
return lnm_err_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
ltm_err lander_data_to_template(size_t *written, char *buf, size_t len, void *data) {
|
||||||
|
lsm_entry_handle *entry = data;
|
||||||
|
|
||||||
|
lsm_entry_data_read(written, buf, entry, len);
|
||||||
|
|
||||||
|
return ltm_err_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
lnm_http_step_err lander_get_paste(lnm_http_conn *conn) {
|
||||||
|
lnm_http_loop_ctx *ctx = conn->ctx;
|
||||||
|
lander_gctx *c_gctx = ctx->g->c;
|
||||||
|
lander_ctx *c_ctx = ctx->c;
|
||||||
|
|
||||||
|
ltm_template_instantiate(&c_ctx->instance, c_gctx->templates.paste);
|
||||||
|
/* ltm_instance_block_add_var(c_ctx->instance, ltm_instance_block_type_buf, lsm_str_ptr(c_ctx->entry)) */
|
||||||
|
ltm_instance_block_add_var_fn(c_ctx->instance, "paste", lander_data_to_template, c_ctx->entry, lsm_entry_data_len(c_ctx->entry));
|
||||||
|
|
||||||
|
|
||||||
|
lnm_http_res_body_set_fn(&ctx->res, lander_template_streamer,
|
||||||
|
ltm_instance_size(c_ctx->instance));
|
||||||
|
lnm_http_res_add_header(&ctx->res, lnm_http_header_content_type, "text/html",
|
||||||
false);
|
false);
|
||||||
|
|
||||||
return lnm_http_step_err_done;
|
return lnm_http_step_err_done;
|
||||||
|
|
|
@ -4,10 +4,17 @@
|
||||||
|
|
||||||
#include "lnm/http/loop.h"
|
#include "lnm/http/loop.h"
|
||||||
#include "lnm/log.h"
|
#include "lnm/log.h"
|
||||||
|
#include "ltm/template.h"
|
||||||
|
|
||||||
#include "lander.h"
|
#include "lander.h"
|
||||||
|
|
||||||
const char *lander_server = "lander/" LANDER_VERSION;
|
const char *lander_server = "lander/" LANDER_VERSION;
|
||||||
|
const char *paste_template =
|
||||||
|
"<!doctype html>\n"
|
||||||
|
"<head><link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/styles/stackoverflow-dark.min.css\">\n"
|
||||||
|
"<script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js\"></script>\n"
|
||||||
|
"<script>hljs.highlightAll();</script></head>\n"
|
||||||
|
"<body><h1>{{ header }}</h1><pre><code>{{ paste }}</code></pre></body>";
|
||||||
|
|
||||||
lnm_http_loop *loop_init(lander_gctx *gctx, const char *api_key) {
|
lnm_http_loop *loop_init(lander_gctx *gctx, const char *api_key) {
|
||||||
lnm_http_loop *hl;
|
lnm_http_loop *hl;
|
||||||
|
@ -117,6 +124,8 @@ int main() {
|
||||||
lander_gctx *c_gctx = lander_gctx_init();
|
lander_gctx *c_gctx = lander_gctx_init();
|
||||||
c_gctx->data_dir = data_dir_s;
|
c_gctx->data_dir = data_dir_s;
|
||||||
|
|
||||||
|
ltm_template_compile(&c_gctx->templates.paste, paste_template);
|
||||||
|
|
||||||
lsm_str *data_dir;
|
lsm_str *data_dir;
|
||||||
lsm_str_init_copy(&data_dir, (char *)data_dir_s);
|
lsm_str_init_copy(&data_dir, (char *)data_dir_s);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue