git-trace

romele / git-trace public

62 commits · 1 branch · 1 tag · 1 contributor (top: Romele) · first commit 3d ago · last push 10m ago

src/httpd.h

#ifndef GT_HTTPD_H
#define GT_HTTPD_H

#include "util.h"

#define HDR_MAX   16384
#define URI_MAX   2048
#define PATH_MAX_LEN 1024
#define QUERY_MAX 1024

struct request {
    int   fd;
    char  method[8];
    char  path[PATH_MAX_LEN];   /* url-decoded path */
    char  query[QUERY_MAX];     /* raw query string */
    long  content_length;       /* -1 if absent */
    long  body_left;            /* unread body bytes */
    int   chunked;              /* Transfer-Encoding: chunked seen */
    char *over;                 /* body bytes already buffered */
    size_t over_len, over_off;
    char *hdrs;                 /* header lines block, '\n'-separated */
    int   user_id;              /* 0 = anonymous */
    char  user_name[64];
    char  session_tok[65];      /* raw gt_session cookie, "" if absent */
    char  remote_ip[64];        /* peer address (rate limiting) */
    int   open_reg;             /* instance allows public signup */
};

/* case-insensitive header lookup; NULL if absent */
const char *req_header(struct request *r, const char *name);
/* malloc'd, trimmed header value; NULL if absent */
char *req_header_dup(struct request *r, const char *name);
/* extract ?k=v (url-decoded) into out; returns 0 on success */
int req_query(struct request *r, const char *key, char *out, size_t outlen);
/* consume request body: buffered overread first, then socket */
long body_read(struct request *r, void *buf, size_t n);

void http_respond_csp(struct request *r, int code, const char *ctype,
                      const char *csp, const char *body, size_t n);
void http_respond(struct request *r, int code, const char *ctype,
                  const char *body, size_t n);
void http_error(struct request *r, int code, const char *msg);
void http_unauthorized(struct request *r, const char *msg);
void http_redirect(struct request *r, const char *location);
/* 302 + Set-Cookie, used by login/logout */
void http_redirect_cookie(struct request *r, const char *location,
                          const char *set_cookie);
void http_write_all(int fd, const void *p, size_t n);

struct server;
typedef void (*route_fn)(void *ctx, struct request *r);
void httpd_run(int port, void *ctx, route_fn route,
               const char *alt_origin);

#endif