Skip to content

Commit

Permalink
Victor/http/move request to internal (Azure#347)
Browse files Browse the repository at this point in the history
* http request moved to internal

* moving http request methods to internal headers

* rename status code with underscore

* make all private functions have _ as starting

* remove unused include
  • Loading branch information
vhvb1989 authored Feb 13, 2020
1 parent 2750397 commit 5aae49f
Show file tree
Hide file tree
Showing 39 changed files with 652 additions and 570 deletions.
4 changes: 2 additions & 2 deletions sdk/core/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ add_library (
src/az_credentials.c
src/az_http_pipeline.c
src/az_http_policy.c
src/az_http_request_builder.c
src/az_http_response_parser.c
src/az_http_request.c
src/az_http_response.c
src/az_json_builder.c
src/az_json_get.c
src/az_json_parser.c
Expand Down
2 changes: 1 addition & 1 deletion sdk/core/core/inc/az_credentials.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ typedef struct {
} _az_token;

typedef AZ_NODISCARD az_result (
*_az_credential_apply_fn)(void * credential_options, az_http_request * ref_request);
*_az_credential_apply_fn)(void * credential_options, _az_http_request * ref_request);

typedef AZ_NODISCARD az_result (*_az_credential_set_scopes_fn)(void * credential, az_span scopes);

Expand Down
316 changes: 118 additions & 198 deletions sdk/core/core/inc/az_http.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,60 @@ enum {
AZ_HTTP_URL_MAX_SIZE = 1024 * 2,
};

typedef az_span az_http_method;

typedef struct {
struct {
az_http_method method;
az_span url;
int32_t query_start;
az_span headers;
int32_t max_headers;
int32_t retry_headers_start_byte_offset;
az_span body;
} _internal;
} _az_http_request;

typedef enum {
AZ_HTTP_RESPONSE_KIND_STATUS_LINE = 0,
AZ_HTTP_RESPONSE_KIND_HEADER = 1,
AZ_HTTP_RESPONSE_KIND_BODY = 2,
AZ_HTTP_RESPONSE_KIND_EOF = 3,
} az_http_response_kind;

typedef struct {
struct {
az_span http_response;
struct {
az_span remaining; // the remaining un-parsed portion of the original http_response.
az_http_response_kind next_kind; // after parsing an element, this is set to the next kind of
// thing we will be parsing.
} parser;
} _internal;
} az_http_response;

// Required to define az_http_policy for using it to create policy process definition
typedef struct _az_http_policy _az_http_policy;

typedef AZ_NODISCARD az_result (*_az_http_policy_process_fn)(
_az_http_policy * p_policies,
void * p_options,
_az_http_request * p_request,
az_http_response * p_response);

struct _az_http_policy {
struct {
_az_http_policy_process_fn process;
void * p_options;
} _internal;
};

typedef struct {
struct {
_az_http_policy p_policies[10];
} _internal;
} _az_http_pipeline;

typedef struct {
// Services pass API versions in the header or in query parameters
// true: api version is passed via headers
Expand Down Expand Up @@ -59,212 +113,78 @@ AZ_NODISCARD AZ_INLINE az_http_policy_retry_options az_http_policy_retry_options
};
}

typedef az_span az_http_method;

typedef struct {
struct {
az_http_method method;
az_span url;
int32_t query_start;
az_span headers;
int32_t max_headers;
int32_t retry_headers_start_byte_offset;
// int32_t headers_end;
az_span body;
} _internal;
} az_http_request;

AZ_INLINE az_http_method az_http_method_get() { return AZ_SPAN_FROM_STR("GET"); }
AZ_INLINE az_http_method az_http_method_head() { return AZ_SPAN_FROM_STR("HEAD"); }
AZ_INLINE az_http_method az_http_method_post() { return AZ_SPAN_FROM_STR("POST"); }
AZ_INLINE az_http_method az_http_method_put() { return AZ_SPAN_FROM_STR("PUT"); }
AZ_INLINE az_http_method az_http_method_delete() { return AZ_SPAN_FROM_STR("DELETE"); }
AZ_INLINE az_http_method az_http_method_patch() { return AZ_SPAN_FROM_STR("PATCH"); }

/**
* @brief Format buffer as a http request containing URL and header spans.
*
* @param p_request HTTP request builder to initialize.
* @param method HTTP verb: `"GET"`, `"POST"`, etc.
* @param url Maximum URL length (see @ref az_http_request_builder_set_query_parameter).
* @param headers_buffer HTTP verb: `"GET"`, `"POST"`, etc.
* @param body URL.
*
* @return
* - *`AZ_OK`* success.
* - *`AZ_ERROR_BUFFER_OVERFLOW`* `buffer` does not have enough space to fit the `max_url_size`.
* - *`AZ_ERROR_ARG`*
* - `p_request` is _NULL_.
* - `buffer`, `method_verb`, or `initial_url` are invalid spans (see @ref az_span_is_valid).
* - `max_url_size` is less than `initial_url.size`.
*/
AZ_NODISCARD az_result az_http_request_init(
az_http_request * p_request,
az_http_method method,
az_span url,
az_span headers_buffer,
az_span body);

/**
* @brief Adds path to url request.
* For instance, if url in request is `http://example.net?qp=1` and this function is called with
* path equals to `test`, then request url will be updated to `http://example.net/test?qp=1`.
*
*
* @param p_request http request builder reference
* @param path span to a path to be appended into url
* @return AZ_NODISCARD az_http_request_builder_append_path
*/
AZ_NODISCARD az_result az_http_request_append_path(az_http_request * p_request, az_span path);

/**
* @brief Set query parameter.
*
* @param p_request HTTP request builder that holds the URL to set the query parameter to.
* @param name URL parameter name.
* @param value URL parameter value.
*
* @return
* - *`AZ_OK`* success.
* - *`AZ_ERROR_BUFFER_OVERFLOW`* the `URL` would grow past the `max_url_size`, should the
* parameter gets set.
* - *`AZ_ERROR_ARG`*
* - `p_request` is _NULL_.
* - `name` or `value` are invalid spans (see @ref az_span_is_valid).
* - `name` or `value` are empty.
* - `name`'s or `value`'s buffer overlap resulting `url`'s buffer.
*/
AZ_NODISCARD az_result
az_http_request_set_query_parameter(az_http_request * p_request, az_span name, az_span value);

/**
* @brief Add a new HTTP header for the request.
*
* @param p_request HTTP request builder that holds the URL to set the query parameter to.
* @param key Header name (e.g. `"Content-Type"`).
* @param value Header value (e.g. `"application/x-www-form-urlencoded"`).
*
* @return
* - *`AZ_OK`* success.
* - *`AZ_ERROR_BUFFER_OVERFLOW`* there isn't enough space in the `p_request->buffer` to add a
* header.
* - *`AZ_ERROR_ARG`*
* - `p_request` is _NULL_.
* - `key` or `value` are invalid spans (see @ref az_span_is_valid).
* - `key` or `value` are empty.
* - `name`'s or `value`'s buffer overlap resulting `url`'s buffer.
*/
AZ_NODISCARD az_result
az_http_request_append_header(az_http_request * p_request, az_span key, az_span value);

/**
* @brief Get the HTTP header by index.
*
* @param p_request HTTP request builder.
* @param index Index of the HTTP header to get from the builder.
* @param out_result Pointer to write the result to.
*
* @return
* - *`AZ_OK`* success.
* - *`AZ_ERROR_ARG`*
* - `p_request` or `out_result` are _NULL_.
* - `index` is out of range.
*/
AZ_NODISCARD az_result
az_http_request_get_header(az_http_request const * p_request, int32_t index, az_pair * out_result);

typedef enum {
AZ_HTTP_RESPONSE_KIND_STATUS_LINE = 0,
AZ_HTTP_RESPONSE_KIND_HEADER = 1,
AZ_HTTP_RESPONSE_KIND_BODY = 2,
AZ_HTTP_RESPONSE_KIND_EOF = 3,
} az_http_response_kind;

typedef struct {
struct {
az_span http_response;
struct {
az_span remaining; // the remaining un-parsed portion of the original http_response.
az_http_response_kind next_kind; // after parsing an element, this is set to the next kind of
// thing we will be parsing.
} parser;
} _internal;
} az_http_response;

///////////////////////////////////////////////

typedef enum {
// 1xx (information) Status Codes:
AZ_HTTP_STATUS_CODE_CONTINUE = 100,
AZ_HTTP_STATUS_CODE_SWITCHING_PROTOCOLS = 101,
AZ_HTTP_STATUS_CODE_PROCESSING = 102,
AZ_HTTP_STATUS_CODE_EARLY_HINTS = 103,
_AZ_HTTP_STATUS_CODE_CONTINUE = 100,
_AZ_HTTP_STATUS_CODE_SWITCHING_PROTOCOLS = 101,
_AZ_HTTP_STATUS_CODE_PROCESSING = 102,
_AZ_HTTP_STATUS_CODE_EARLY_HINTS = 103,

// 2xx (successful) Status Codes:
AZ_HTTP_STATUS_CODE_OK = 200,
AZ_HTTP_STATUS_CODE_CREATED = 201,
AZ_HTTP_STATUS_CODE_ACCEPTED = 202,
AZ_HTTP_STATUS_CODE_NON_AUTHORITATIVE_INFORMATION = 203,
AZ_HTTP_STATUS_CODE_NO_CONTENT = 204,
AZ_HTTP_STATUS_CODE_RESET_CONTENT = 205,
AZ_HTTP_STATUS_CODE_PARTIAL_CONTENT = 206,
AZ_HTTP_STATUS_CODE_MULTI_STATUS = 207,
AZ_HTTP_STATUS_CODE_ALREADY_REPORTED = 208,
AZ_HTTP_STATUS_CODE_IM_USED = 226,
_AZ_HTTP_STATUS_CODE_OK = 200,
_AZ_HTTP_STATUS_CODE_CREATED = 201,
_AZ_HTTP_STATUS_CODE_ACCEPTED = 202,
_AZ_HTTP_STATUS_CODE_NON_AUTHORITATIVE_INFORMATION = 203,
_AZ_HTTP_STATUS_CODE_NO_CONTENT = 204,
_AZ_HTTP_STATUS_CODE_RESET_CONTENT = 205,
_AZ_HTTP_STATUS_CODE_PARTIAL_CONTENT = 206,
_AZ_HTTP_STATUS_CODE_MULTI_STATUS = 207,
_AZ_HTTP_STATUS_CODE_ALREADY_REPORTED = 208,
_AZ_HTTP_STATUS_CODE_IM_USED = 226,

// 3xx (redirection) Status Codes:
AZ_HTTP_STATUS_CODE_MULTIPLE_CHOICES = 300,
AZ_HTTP_STATUS_CODE_MOVED_PERMANENTLY = 301,
AZ_HTTP_STATUS_CODE_FOUND = 302,
AZ_HTTP_STATUS_CODE_SEE_OTHER = 303,
AZ_HTTP_STATUS_CODE_NOT_MODIFIED = 304,
AZ_HTTP_STATUS_CODE_USE_PROXY = 305,
AZ_HTTP_STATUS_CODE_TEMPORARY_REDIRECT = 307,
AZ_HTTP_STATUS_CODE_PERMANENT_REDIRECT = 308,
_AZ_HTTP_STATUS_CODE_MULTIPLE_CHOICES = 300,
_AZ_HTTP_STATUS_CODE_MOVED_PERMANENTLY = 301,
_AZ_HTTP_STATUS_CODE_FOUND = 302,
_AZ_HTTP_STATUS_CODE_SEE_OTHER = 303,
_AZ_HTTP_STATUS_CODE_NOT_MODIFIED = 304,
_AZ_HTTP_STATUS_CODE_USE_PROXY = 305,
_AZ_HTTP_STATUS_CODE_TEMPORARY_REDIRECT = 307,
_AZ_HTTP_STATUS_CODE_PERMANENT_REDIRECT = 308,

// 4xx (client error) Status Codes:
AZ_HTTP_STATUS_CODE_BAD_REQUEST = 400,
AZ_HTTP_STATUS_CODE_UNAUTHORIZED = 401,
AZ_HTTP_STATUS_CODE_PAYMENT_REQUIRED = 402,
AZ_HTTP_STATUS_CODE_FORBIDDEN = 403,
AZ_HTTP_STATUS_CODE_NOT_FOUND = 404,
AZ_HTTP_STATUS_CODE_METHOD_NOT_ALLOWED = 405,
AZ_HTTP_STATUS_CODE_NOT_ACCEPTABLE = 406,
AZ_HTTP_STATUS_CODE_PROXY_AUTHENTICATION_REQUIRED = 407,
AZ_HTTP_STATUS_CODE_REQUEST_TIMEOUT = 408,
AZ_HTTP_STATUS_CODE_CONFLICT = 409,
AZ_HTTP_STATUS_CODE_GONE = 410,
AZ_HTTP_STATUS_CODE_LENGTH_REQUIRED = 411,
AZ_HTTP_STATUS_CODE_PRECONDITION_FAILED = 412,
AZ_HTTP_STATUS_CODE_PAYLOAD_TOO_LARGE = 413,
AZ_HTTP_STATUS_CODE_URI_TOO_LONG = 414,
AZ_HTTP_STATUS_CODE_UNSUPPORTED_MEDIA_TYPE = 415,
AZ_HTTP_STATUS_CODE_RANGE_NOT_SATISFIABLE = 416,
AZ_HTTP_STATUS_CODE_EXPECTATION_FAILED = 417,
AZ_HTTP_STATUS_CODE_MISDIRECTED_REQUEST = 421,
AZ_HTTP_STATUS_CODE_UNPROCESSABLE_ENTITY = 422,
AZ_HTTP_STATUS_CODE_LOCKED = 423,
AZ_HTTP_STATUS_CODE_FAILED_DEPENDENCY = 424,
AZ_HTTP_STATUS_CODE_TOO_EARLY = 425,
AZ_HTTP_STATUS_CODE_UPGRADE_REQUIRED = 426,
AZ_HTTP_STATUS_CODE_PRECONDITION_REQUIRED = 428,
AZ_HTTP_STATUS_CODE_TOO_MANY_REQUESTS = 429,
AZ_HTTP_STATUS_CODE_REQUEST_HEADER_FIELDS_TOO_LARGE = 431,
AZ_HTTP_STATUS_CODE_UNAVAILABLE_FOR_LEGAL_REASONS = 451,
_AZ_HTTP_STATUS_CODE_BAD_REQUEST = 400,
_AZ_HTTP_STATUS_CODE_UNAUTHORIZED = 401,
_AZ_HTTP_STATUS_CODE_PAYMENT_REQUIRED = 402,
_AZ_HTTP_STATUS_CODE_FORBIDDEN = 403,
_AZ_HTTP_STATUS_CODE_NOT_FOUND = 404,
_AZ_HTTP_STATUS_CODE_METHOD_NOT_ALLOWED = 405,
_AZ_HTTP_STATUS_CODE_NOT_ACCEPTABLE = 406,
_AZ_HTTP_STATUS_CODE_PROXY_AUTHENTICATION_REQUIRED = 407,
_AZ_HTTP_STATUS_CODE_REQUEST_TIMEOUT = 408,
_AZ_HTTP_STATUS_CODE_CONFLICT = 409,
_AZ_HTTP_STATUS_CODE_GONE = 410,
_AZ_HTTP_STATUS_CODE_LENGTH_REQUIRED = 411,
_AZ_HTTP_STATUS_CODE_PRECONDITION_FAILED = 412,
_AZ_HTTP_STATUS_CODE_PAYLOAD_TOO_LARGE = 413,
_AZ_HTTP_STATUS_CODE_URI_TOO_LONG = 414,
_AZ_HTTP_STATUS_CODE_UNSUPPORTED_MEDIA_TYPE = 415,
_AZ_HTTP_STATUS_CODE_RANGE_NOT_SATISFIABLE = 416,
_AZ_HTTP_STATUS_CODE_EXPECTATION_FAILED = 417,
_AZ_HTTP_STATUS_CODE_MISDIRECTED_REQUEST = 421,
_AZ_HTTP_STATUS_CODE_UNPROCESSABLE_ENTITY = 422,
_AZ_HTTP_STATUS_CODE_LOCKED = 423,
_AZ_HTTP_STATUS_CODE_FAILED_DEPENDENCY = 424,
_AZ_HTTP_STATUS_CODE_TOO_EARLY = 425,
_AZ_HTTP_STATUS_CODE_UPGRADE_REQUIRED = 426,
_AZ_HTTP_STATUS_CODE_PRECONDITION_REQUIRED = 428,
_AZ_HTTP_STATUS_CODE_TOO_MANY_REQUESTS = 429,
_AZ_HTTP_STATUS_CODE_REQUEST_HEADER_FIELDS_TOO_LARGE = 431,
_AZ_HTTP_STATUS_CODE_UNAVAILABLE_FOR_LEGAL_REASONS = 451,

// 5xx (server error) Status Codes:
AZ_HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR = 500,
AZ_HTTP_STATUS_CODE_NOT_IMPLEMENTED = 501,
AZ_HTTP_STATUS_CODE_BAD_GATEWAY = 502,
AZ_HTTP_STATUS_CODE_SERVICE_UNAVAILABLE = 503,
AZ_HTTP_STATUS_CODE_GATEWAY_TIMEOUT = 504,
AZ_HTTP_STATUS_CODE_HTTP_VERSION_NOT_SUPPORTED = 505,
AZ_HTTP_STATUS_CODE_VARIANT_ALSO_NEGOTIATES = 506,
AZ_HTTP_STATUS_CODE_INSUFFICIENT_STORAGE = 507,
AZ_HTTP_STATUS_CODE_LOOP_DETECTED = 508,
AZ_HTTP_STATUS_CODE_NOT_EXTENDED = 510,
AZ_HTTP_STATUS_CODE_NETWORK_AUTHENTICATION_REQUIRED = 511,
} az_http_status_code;
_AZ_HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR = 500,
_AZ_HTTP_STATUS_CODE_NOT_IMPLEMENTED = 501,
_AZ_HTTP_STATUS_CODE_BAD_GATEWAY = 502,
_AZ_HTTP_STATUS_CODE_SERVICE_UNAVAILABLE = 503,
_AZ_HTTP_STATUS_CODE_GATEWAY_TIMEOUT = 504,
_AZ_HTTP_STATUS_CODE_HTTP_VERSION_NOT_SUPPORTED = 505,
_AZ_HTTP_STATUS_CODE_VARIANT_ALSO_NEGOTIATES = 506,
_AZ_HTTP_STATUS_CODE_INSUFFICIENT_STORAGE = 507,
_AZ_HTTP_STATUS_CODE_LOOP_DETECTED = 508,
_AZ_HTTP_STATUS_CODE_NOT_EXTENDED = 510,
_AZ_HTTP_STATUS_CODE_NETWORK_AUTHENTICATION_REQUIRED = 511,
} _az_http_status_code;

/**
* An HTTP response status line
Expand All @@ -274,7 +194,7 @@ typedef enum {
typedef struct {
uint8_t major_version;
uint8_t minor_version;
az_http_status_code status_code;
_az_http_status_code status_code;
az_span reason_phrase;
} az_http_response_status_line;

Expand Down Expand Up @@ -340,7 +260,7 @@ AZ_NODISCARD AZ_INLINE az_result az_http_response_reset(az_http_response * self)
}

typedef AZ_NODISCARD az_result (
*az_http_client_send_request_fn)(az_http_request * p_request, az_http_response * p_response);
*az_http_client_send_request_fn)(_az_http_request * p_request, az_http_response * p_response);

typedef struct {
struct {
Expand Down
Loading

0 comments on commit 5aae49f

Please sign in to comment.