http-response.h revision 17908b11e2e0cece58f0b653876385da5d62f3c0
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen#ifndef HTTP_RESPONSE_H
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen#define HTTP_RESPONSE_H
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch#include "array.h"
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch#include "http-header.h"
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
a8741f46cb3cf40e58e3d47b263f238918243380Stephan Bosch#define HTTP_RESPONSE_STATUS_INTERNAL 9000
a8741f46cb3cf40e58e3d47b263f238918243380Stephan Bosch
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Boschenum http_response_payload_type {
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch HTTP_RESPONSE_PAYLOAD_TYPE_ALLOWED,
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch HTTP_RESPONSE_PAYLOAD_TYPE_NOT_PRESENT,
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch HTTP_RESPONSE_PAYLOAD_TYPE_ONLY_UNSUCCESSFUL
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch};
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainenstruct http_response {
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen unsigned char version_major;
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen unsigned char version_minor;
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen unsigned int status;
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen const char *reason;
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen const char *location;
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
7af70f7646264a2f52b361f9ca78f08681acc4e2Stephan Bosch time_t date, retry_after;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch const struct http_header *header;
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen struct istream *payload;
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
9e7bf91667639a2390207ab4d90bf88e2afcec2aStephan Bosch ARRAY_TYPE(const_string) connection_options;
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen bool connection_close:1;
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen};
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen
c9779bb27bb927a49de946e66f178126ecd451b6Stephan Boschvoid
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Boschhttp_response_init(struct http_response *resp,
c9779bb27bb927a49de946e66f178126ecd451b6Stephan Bosch unsigned int status, const char *reason);
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Boschstatic inline const struct http_header_field *
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Boschhttp_response_header_find(const struct http_response *resp, const char *name)
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch{
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch if (resp->header == NULL)
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch return NULL;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch return http_header_field_find(resp->header, name);
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch}
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Boschstatic inline const char *
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Boschhttp_response_header_get(const struct http_response *resp, const char *name)
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch{
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch if (resp->header == NULL)
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch return NULL;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch return http_header_field_get(resp->header, name);
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch}
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Boschstatic inline const ARRAY_TYPE(http_header_field) *
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Boschhttp_response_header_get_fields(const struct http_response *resp)
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch{
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch if (resp->header == NULL)
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch return NULL;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch return http_header_get_fields(resp->header);
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch}
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
17908b11e2e0cece58f0b653876385da5d62f3c0Stephan Boschstatic inline const char *
17908b11e2e0cece58f0b653876385da5d62f3c0Stephan Boschhttp_response_get_message(const struct http_response *resp)
17908b11e2e0cece58f0b653876385da5d62f3c0Stephan Bosch{
17908b11e2e0cece58f0b653876385da5d62f3c0Stephan Bosch if (resp->status >= HTTP_RESPONSE_STATUS_INTERNAL)
17908b11e2e0cece58f0b653876385da5d62f3c0Stephan Bosch return resp->reason;
17908b11e2e0cece58f0b653876385da5d62f3c0Stephan Bosch return t_strdup_printf("%u %s", resp->status, resp->reason);
17908b11e2e0cece58f0b653876385da5d62f3c0Stephan Bosch}
17908b11e2e0cece58f0b653876385da5d62f3c0Stephan Bosch
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Boschbool http_response_has_connection_option(const struct http_response *resp,
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch const char *option);
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Boschint http_response_get_payload_size(const struct http_response *resp,
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch uoff_t *size_r);
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch
1920ef85b63738a06914e56508049dd0afe38732Timo Sirainen#endif