feat(lnm): start of processing code
	
		
			
	
		
	
	
		
			
				
	
				ci/woodpecker/push/build Pipeline was successful
				
					Details
				
			
		
	
				
					
				
			
				
	
				ci/woodpecker/push/build Pipeline was successful
				
					Details
				
			
		
	
							parent
							
								
									4c2b85d436
								
							
						
					
					
						commit
						e04f6e170e
					
				| 
						 | 
				
			
			@ -1,19 +1,26 @@
 | 
			
		|||
#ifndef LNM_HTTP_LOOP
 | 
			
		||||
#define LNM_HTTP_LOOP
 | 
			
		||||
 | 
			
		||||
#include "lnm/common.h"
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#define LNM_HTTP_MAX_REQ_HEADERS 32
 | 
			
		||||
#include "lnm/common.h"
 | 
			
		||||
#include "lnm/http/req.h"
 | 
			
		||||
 | 
			
		||||
typedef struct lnm_loop lnm_http_loop;
 | 
			
		||||
 | 
			
		||||
typedef struct lnm_conn lnm_http_conn;
 | 
			
		||||
typedef struct lnm_loop_conn lnm_http_conn;
 | 
			
		||||
 | 
			
		||||
typedef struct lnm_http_step lnm_http_step;
 | 
			
		||||
 | 
			
		||||
typedef struct lnm_http_route lnm_http_route;
 | 
			
		||||
 | 
			
		||||
typedef lnm_err (*lnm_http_step_fn)(lnm_http_conn *conn);
 | 
			
		||||
typedef enum lnm_step_err {
 | 
			
		||||
  lnm_step_err_done = 0,
 | 
			
		||||
  lnm_step_err_io_needed,
 | 
			
		||||
  lnm_step_err_close,
 | 
			
		||||
} lnm_step_err;
 | 
			
		||||
 | 
			
		||||
typedef lnm_step_err (*lnm_http_step_fn)(lnm_http_conn *conn);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Initialize a new `lnm_http_loop`.
 | 
			
		||||
| 
						 | 
				
			
			@ -66,10 +73,23 @@ void lnm_http_loop_route_add(lnm_http_loop *hl, lnm_http_route *route);
 | 
			
		|||
 */
 | 
			
		||||
typedef enum lnm_http_loop_state {
 | 
			
		||||
  lnm_http_loop_state_parse_req = 0,
 | 
			
		||||
  lnm_http_loop_state_route,
 | 
			
		||||
  lnm_http_loop_state_steps,
 | 
			
		||||
} lnm_http_loop_state;
 | 
			
		||||
 | 
			
		||||
typedef struct lnm_http_loop_gctx {
 | 
			
		||||
  struct {
 | 
			
		||||
    lnm_http_route **arr;
 | 
			
		||||
    size_t len;
 | 
			
		||||
  } routes;
 | 
			
		||||
  void *c;
 | 
			
		||||
} lnm_http_loop_gctx;
 | 
			
		||||
 | 
			
		||||
typedef struct lnm_http_loop_ctx {
 | 
			
		||||
  lnm_http_loop_state state;
 | 
			
		||||
  lnm_http_req req;
 | 
			
		||||
  lnm_http_loop_gctx *g;
 | 
			
		||||
  void *c;
 | 
			
		||||
} lnm_http_loop_ctx;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,8 @@
 | 
			
		|||
#include "picohttpparser.h"
 | 
			
		||||
 | 
			
		||||
#include "lnm/http/consts.h"
 | 
			
		||||
#include "lnm/http/loop.h"
 | 
			
		||||
 | 
			
		||||
#define LNM_HTTP_MAX_REQ_HEADERS 32
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents the parsed HTTP request
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ typedef enum {
 | 
			
		|||
  lnm_loop_state_end,
 | 
			
		||||
} lnm_loop_state;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
typedef struct lnm_loop_conn {
 | 
			
		||||
  int fd;
 | 
			
		||||
  lnm_loop_state state;
 | 
			
		||||
  void *ctx;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
#include "lnm/http/loop.h"
 | 
			
		||||
#include "lnm/http/loop_internal.h"
 | 
			
		||||
#include "lnm/http/req.h"
 | 
			
		||||
#include "lnm/loop.h"
 | 
			
		||||
#include "lnm/loop_internal.h"
 | 
			
		||||
 | 
			
		||||
void lnm_http_loop_process_parse_req(lnm_http_conn *conn) {
 | 
			
		||||
  lnm_http_loop_ctx *ctx = conn->ctx;
 | 
			
		||||
 | 
			
		||||
  lnm_http_parse_err res = lnm_http_req_parse(
 | 
			
		||||
      &ctx->req, &conn->r.buf[conn->r.read], conn->r.size - conn->r.read);
 | 
			
		||||
 | 
			
		||||
  switch (res) {
 | 
			
		||||
  case lnm_http_parse_err_ok:
 | 
			
		||||
    ctx->state = lnm_http_loop_state_steps;
 | 
			
		||||
    break;
 | 
			
		||||
  case lnm_http_parse_err_incomplete:
 | 
			
		||||
    // If the request is already the size of the read buffer, we close the
 | 
			
		||||
    // request. Otherwise, we wait for anything read
 | 
			
		||||
    if (conn->r.size - conn->r.read == LNM_LOOP_BUF_SIZE) {
 | 
			
		||||
      conn->state = lnm_loop_state_end;
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  case lnm_http_parse_err_invalid:
 | 
			
		||||
    conn->state = lnm_loop_state_end;
 | 
			
		||||
    break;
 | 
			
		||||
  case lnm_http_parse_err_unknown_method:
 | 
			
		||||
    // TODO set status code here
 | 
			
		||||
    conn->state = lnm_loop_state_end;
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void lnm_http_loop_process_route(lnm_http_conn *conn) {}
 | 
			
		||||
 | 
			
		||||
void lnm_http_loop_process_steps(lnm_http_conn *conn) {
 | 
			
		||||
  /* lnm_http_loop_ctx *ctx = conn->ctx; */
 | 
			
		||||
 | 
			
		||||
  /* while () */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void (*process_fns[])(lnm_http_conn *conn) = {
 | 
			
		||||
    lnm_http_loop_process_parse_req,
 | 
			
		||||
    lnm_http_loop_process_route,
 | 
			
		||||
    lnm_http_loop_process_steps,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void lnm_http_loop_process(lnm_http_conn *conn) {
 | 
			
		||||
  lnm_http_loop_ctx *ctx = conn->ctx;
 | 
			
		||||
 | 
			
		||||
  lnm_http_loop_state cur_state;
 | 
			
		||||
 | 
			
		||||
  // As long as the processing is able to advance to a next state, we keep
 | 
			
		||||
  // progressing
 | 
			
		||||
  do {
 | 
			
		||||
    cur_state = ctx->state;
 | 
			
		||||
 | 
			
		||||
    process_fns[cur_state](conn);
 | 
			
		||||
  } while (conn->state == lnm_loop_state_req && cur_state != ctx->state);
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue