/** * Parse an HTTP parameter * * \param input Pointer to current input byte. Updated on exit. * \param parameter Pointer to location to receive on-heap parameter. * \return NSERROR_OK on success, * NSERROR_NOMEM on memory exhaustion * * The returned parameter is owned by the caller. */ static nserror http_parse_parameter(const char **input, http_parameter **parameter) { const char *pos = *input; char *name; char *value; http_parameter *param; nserror error; /* token "=" ( token | quoted-string ) */ error = http_parse_token(&pos, &name); if (error != NSERROR_OK) return error; while (*pos == ' ' || *pos == '\t') pos++; if (*pos != '=') { value = strdup(""); if (value == NULL) { free(name); return NSERROR_NOMEM; } } else { pos++; while (*pos == ' ' || *pos == '\t') pos++; if (*pos == '"') error = http_parse_quoted_string(&pos, &value); else error = http_parse_token(&pos, &value); if (error != NSERROR_OK) { free(name); return error; } } param = malloc(sizeof(*param)); if (param == NULL) { free(value); free(name); return NSERROR_NOMEM; } param->next = NULL; param->name = name; param->value = value; *parameter = param; *input = pos; return NSERROR_OK; }
int http_parse_token_or_qstring(struct http_parser *parser, const char **word_r) { if (parser->cur >= parser->end) return 0; if (parser->cur[0] == '"') return http_parse_quoted_string(parser, word_r); return http_parse_token(parser, word_r); }