diff options
| author | Aleksey Veresov <aleksey@veresov.pro> | 2019-11-15 19:14:11 +0300 | 
|---|---|---|
| committer | Aleksey Veresov <aleksey@veresov.pro> | 2019-11-15 19:14:11 +0300 | 
| commit | 42bb3d37c156df14560347d4c7df3f0dd0551389 (patch) | |
| tree | c38f35e836d0b8193246dce6ff2ce489f5ca9026 /src | |
| parent | 32c1fbd2cf779a65e807d0d82412ffffa2401962 (diff) | |
| download | magi-42bb3d37c156df14560347d4c7df3f0dd0551389.tar magi-42bb3d37c156df14560347d4c7df3f0dd0551389.tar.xz magi-42bb3d37c156df14560347d4c7df3f0dd0551389.zip | |
.
Diffstat (limited to 'src')
| -rw-r--r-- | src/cgi.c | 62 | ||||
| -rw-r--r-- | src/cgi.h | 5 | ||||
| -rw-r--r-- | src/error.c | 57 | ||||
| -rw-r--r-- | src/error.h | 17 | ||||
| -rw-r--r-- | src/multipart.c | 16 | ||||
| -rw-r--r-- | src/multipart.h | 7 | 
6 files changed, 73 insertions, 91 deletions
| @@ -74,7 +74,7 @@ static int cgi_http_env(struct magi_request * r)      return ok;  } -static void cgi_env(struct magi_error ** e, struct magi_request * r) +static void cgi_env(enum magi_error * e, struct magi_request * r)  {      cgi_http_env(e, r);      lower_env(e, &r->method, "REQUEST_METHOD"); @@ -93,15 +93,16 @@ static void cgi_env(struct magi_error ** e, struct magi_request * r)      plain_env(e, &r->path_info, "PATH_INFO");  } -static void cgi_cookies(struct magi_error **       e, -                        struct magi_cookie_list ** list) +static void cgi_cookies(enum magi_error * e, struct magi_cookie_list ** list)  { -    const char * env = getenv("HTTP_COOKIE"); -    *list            = 0; -    if (env && *env) { -        magi_parse_cookie(e, list, env); -    } else { -        *list = 0; +    if (!*e) { +        const char * env = getenv("HTTP_COOKIE"); +        *list            = 0; +        if (env && *env) { +            magi_parse_cookie(e, list, env); +        } else { +            *list = 0; +        }      }  } @@ -120,22 +121,21 @@ static int cgi_input_get(char ** input)      return ok;  } -static int cgi_input_post(char ** input, int max) +static void cgi_input_post(enum magi_error * e, char ** input, int max)  { -    int ok        = 1; -    int input_len = strtoul(getenv("CONTENT_LENGTH"), 0, 10); -    if (input_len && (input_len < max || !max)) { -        *input = str_alloc(input_len); -        if (*input) { -            if (fread(*input, 1, input_len, stdin) != input_len) { -                ok = 0; -                magi_error_set("[request:cgi] Content-length is not correct."); +    if (!*e) { +        int input_len = strtoul(getenv("CONTENT_LENGTH"), 0, 10); +        if (input_len && (input_len < max || !max)) { +            *input = str_alloc(input_len); +            if (*input) { +                if (fread(*input, 1, input_len, stdin) != input_len) { +                    *e = magi_error_length; +                } +            } else { +                *e = magi_error_input;              } -        } else { -            ok = 0;          }      } -    return ok;  }  static char * bound(const char * type) @@ -161,13 +161,14 @@ static int intput_getter(void * any)  /* Interfacial CGI Request Handling */  int magi_cgi_request(struct magi_request * request, -                     void (*callback)(struct magi_field * field, char * buffer, -                                      int len), +                     void (*callback)(struct magi_field * field, +                                      char *              buffer, +                                      int                 len),                       int max_post)  { -    request->fields        = 0; -    request->error         = 0; -    struct magi_error ** e = &request->error; +    request->fields     = 0; +    request->error      = magi_error_none; +    enum magi_error * e = &request->error;      cgi_env(e, request);      cgi_cookies(e, &request->cookies);      if (request->method) { @@ -181,8 +182,7 @@ int magi_cgi_request(struct magi_request * request,                                               intput_getter, 0, boundary,                                               callback);                      } else { -                        magi_error_add( -                            e, "[request:cgi] Multipart bound is not set."); +                        *e = magi_error_nobound;                      }                      free(boundary);                  } else if (!strcmp(t, "application/x-www-form-urlencoded")) { @@ -191,10 +191,10 @@ int magi_cgi_request(struct magi_request * request,                      magi_parse_urlencoded(e, &request->fields, in);                      free(in);                  } else { -                    magi_error_add(e, "[request:cgi] Unknown content type."); +                    *e = magi_error_unknown;                  }              } else { -                magi_error_add(e, "[request:cgi] Content-type is not set."); +                *e = magi_error_notype;              }          } else if (!strcmp(request->method, "get")) {              char * in = 0; @@ -203,5 +203,5 @@ int magi_cgi_request(struct magi_request * request,              free(in);          }      } -    return !request->error; +    return request->error == magi_error_none;  } @@ -12,8 +12,9 @@  int magi_cgi(struct magi_request * request,               /* Callback will be used only for fields loaded via multipart. */               /* Null callback disables callback system. */ -             void (*callback)(struct magi_field * field, char * buffer, -                              int len), +             void (*callback)(struct magi_field * field, +                              char *              buffer, +                              int                 len),               int max_post); diff --git a/src/error.c b/src/error.c index 01fae36..4b6f7c2 100644 --- a/src/error.c +++ b/src/error.c @@ -1,49 +1,18 @@  #include "error.h" -#include "utils.h" -#include <stdarg.h> - -void magi_error_add(struct magi_error ** error, char * format, ...) -{ -    if (error && format) { -        struct magi_error * head = malloc(sizeof(*head)); -        if (head) { -            int     size; -            va_list args; - -            va_start(args, format); -            size = vsnprintf(0, 0, format, args); -            va_end(args); - -            if (size >= 0) { -                head->message = malloc(++size); -                if (head->message) { -                    va_start(args, format); -                    size = vsnprintf(head->message, size, format, args); -                    va_end(args); -                    if (size >= 0) { -                        head->prev = *error; -                        *error     = head; -                        return; -                    } else { -                        free(head->message); -                    } -                } -            } - -            free(head); -        } -    } -} - -void magi_error_destroy(struct magi_error * error) +const char * magi_error_message(enum magi_error error)  { -    if (error) { -        magi_error_destroy(error->prev); -        free(error->prev); -        free(error->message); -        error->prev    = 0; -        error->message = 0; -    } +    static const char * const messages[] = { +        0,                             /* magi_error_none */ +        "No boundary for multipart.",  /* magi_error_nobound */ +        "Content-type is unknown.",    /* magi_error_unknown */ +        "Content-type is not given.",  /* magi_error_notype */ +        "Mismatch of content length.", /* magi_error_length */ +        "Cannot allocate memmory.",    /* magi_error_memmory */ +        "Cannot read cookies.",        /* magi_error_cookies */ +        "Cannot decode URL.",          /* magi_error_urlenc */ +        "Cannot read multipart body."  /* magi_error_multipart */ +    }; +    return messages[error];  } diff --git a/src/error.h b/src/error.h index b3014c2..ee1c8a6 100644 --- a/src/error.h +++ b/src/error.h @@ -2,14 +2,19 @@  #define MAGI_INCLUDED_ERROR -struct magi_error { -    struct magi_error * prev; -    char *              message; /* enum magi_error_type { ... } type; */ +enum magi_error { +    magi_error_none = 0, +    magi_error_nobound, +    magi_error_unknown, +    magi_error_notype, +    magi_error_length, +    magi_error_memmory, +    magi_error_cookies, +    magi_error_urlenc, +    magi_error_multipart  }; - -void magi_error_add(struct magi_error ** error, char * format, ...); -void magi_error_destroy(struct magi_error * error); +const char * magi_error_message(enum magi_error error);  #endif diff --git a/src/multipart.c b/src/multipart.c index 7847a41..6ab1258 100644 --- a/src/multipart.c +++ b/src/multipart.c @@ -433,8 +433,9 @@ static enum st parse_end(struct automata * a, char c)  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *   * Automata Runner   */ -static int run_automata(struct automata * a, int (*next)(void * thing), -                        void *            thing) +static int run_automata(struct automata * a, +                        int (*next)(void * thing), +                        void * thing)  {      int     ok    = 1;      enum st state = st_begin; @@ -485,13 +486,16 @@ static int run_automata(struct automata * a, int (*next)(void * thing),   * Automata Interfaces   */  int magi_parse_multipart(struct magi_field_list ** list, -                         int (*get_next)(void *), void * get_next_arg, +                         int (*get_next)(void *), +                         void * get_next_arg,                           char * boundary,                           void (*callback)(struct magi_field * field, -                                          char * buffer, int len)) +                                          char *              buffer, +                                          int                 len))  { -    struct automata a -        = { 0, { 0, 0, 0 }, { 0, 0 }, 0, 0, 1, 0, 0, 2, 0, 0, 0 }; +    struct automata a = { +        0, { 0, 0, 0 }, { 0, 0 }, 0, 0, 1, 0, 0, 2, 0, 0, 0 +    };      int ok         = 0;      a.list         = list;      a.boundary     = boundary; diff --git a/src/multipart.h b/src/multipart.h index e9a0004..43b6212 100644 --- a/src/multipart.h +++ b/src/multipart.h @@ -7,8 +7,11 @@  enum { magi_parse_multipart_callback_size = 64 }; -int magi_parse_multipart(struct magi_field_list ** list, -    int (*get_next)(void *), void * get_next_arg, char * boundary, +int magi_parse_multipart( +    struct magi_field_list ** list, +    int (*get_next)(void *), +    void * get_next_arg, +    char * boundary,      /* End if size < magi_parse_multipart_callback_size. */      /* Null callback means filling list. */      void (*callback)(struct magi_field * field, char * buffer, int size)); | 
