diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib-http/http-response.h | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/lib-http/http-response.h b/src/lib-http/http-response.h new file mode 100644 index 0000000..30f6147 --- /dev/null +++ b/src/lib-http/http-response.h @@ -0,0 +1,87 @@ +#ifndef HTTP_RESPONSE_H +#define HTTP_RESPONSE_H + +#include "array.h" + +#include "http-header.h" + +#define HTTP_RESPONSE_STATUS_INTERNAL 9000 + +enum http_response_payload_type { + HTTP_RESPONSE_PAYLOAD_TYPE_ALLOWED, + HTTP_RESPONSE_PAYLOAD_TYPE_NOT_PRESENT, + HTTP_RESPONSE_PAYLOAD_TYPE_ONLY_UNSUCCESSFUL +}; + +struct http_response { + unsigned char version_major; + unsigned char version_minor; + + unsigned int status; + + const char *reason; + const char *location; + + time_t date, retry_after; + const struct http_header *header; + struct istream *payload; + + ARRAY_TYPE(const_string) connection_options; + + bool connection_close:1; +}; + +static inline bool +http_response_is_success(const struct http_response *resp) +{ + return ((resp->status / 100) == 2); +} + +static inline bool +http_response_is_internal_error(const struct http_response *resp) +{ + return (resp->status >= HTTP_RESPONSE_STATUS_INTERNAL); +} + +void +http_response_init(struct http_response *resp, + unsigned int status, const char *reason); + +static inline const struct http_header_field * +http_response_header_find(const struct http_response *resp, const char *name) +{ + if (resp->header == NULL) + return NULL; + return http_header_field_find(resp->header, name); +} + +static inline const char * +http_response_header_get(const struct http_response *resp, const char *name) +{ + if (resp->header == NULL) + return NULL; + return http_header_field_get(resp->header, name); +} + +static inline const ARRAY_TYPE(http_header_field) * +http_response_header_get_fields(const struct http_response *resp) +{ + if (resp->header == NULL) + return NULL; + return http_header_get_fields(resp->header); +} + +static inline const char * +http_response_get_message(const struct http_response *resp) +{ + if (resp->status >= HTTP_RESPONSE_STATUS_INTERNAL) + return resp->reason; + return t_strdup_printf("%u %s", resp->status, resp->reason); +} + +bool http_response_has_connection_option(const struct http_response *resp, + const char *option); +int http_response_get_payload_size(const struct http_response *resp, + uoff_t *size_r); + +#endif |