http-response.h revision e8f1e510df3ab051a816715c2056f0d10aee929e
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen#ifndef HTTP_RESPONSE_H
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#define HTTP_RESPONSE_H
2fbc2a7c65d30e46803195ebb4547176b85c22c7Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#include "array.h"
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#include "http-header.h"
7d6389e4053c2dac1fb37180b5756b00785983dcTimo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#define http_response_header http_header_field /* FIXME: remove in v2.3 */
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
d1f0acc7fc722e13e8296228703adfe8a884d59eTimo Sirainenstruct http_response {
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen unsigned char version_major;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen unsigned char version_minor;
e714eed72515794c46c6712a611e5ab924d903daTimo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen unsigned int status;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen const char *reason;
0cb57ee35d4cab9c03434d7abf312c081ed554d4Timo Sirainen const char *location;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen time_t date;
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainen const struct http_header *header;
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen struct istream *payload;
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainen
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainen /* FIXME: remove in v2.3 */
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen ARRAY_TYPE(http_header_field) headers;
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen ARRAY_TYPE(const_string) connection_options;
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainen
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainen unsigned int connection_close:1;
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainen};
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen
594d203bdcbd160688bce5d5a6d65783b919ad49Timo Sirainenstatic inline void
594d203bdcbd160688bce5d5a6d65783b919ad49Timo Sirainenhttp_response_init(struct http_response *resp,
594d203bdcbd160688bce5d5a6d65783b919ad49Timo Sirainen unsigned int status, const char *reason)
594d203bdcbd160688bce5d5a6d65783b919ad49Timo Sirainen{
a8fc29f19ea6e2d472ba779b2dd5ca4e1f3dac79Timo Sirainen memset(resp, 0, sizeof(*resp));
a8fc29f19ea6e2d472ba779b2dd5ca4e1f3dac79Timo Sirainen resp->status = status;
3e1ded79bbc9166aa221bcf62d8eb2bee179c557Timo Sirainen resp->reason = reason;
3e1ded79bbc9166aa221bcf62d8eb2bee179c557Timo Sirainen}
3e1ded79bbc9166aa221bcf62d8eb2bee179c557Timo Sirainen
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainenstatic inline const struct http_header_field *
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainenhttp_response_header_find(const struct http_response *resp, const char *name)
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen{
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen if (resp->header == NULL)
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen return NULL;
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen return http_header_field_find(resp->header, name);
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen}
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainenstatic inline const char *
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainenhttp_response_header_get(const struct http_response *resp, const char *name)
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen{
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen if (resp->header == NULL)
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen return NULL;
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen return http_header_field_get(resp->header, name);
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen}
1cb29929a19dea32779606cd54a1e63aefead88dTimo Sirainen
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainenstatic inline const ARRAY_TYPE(http_header_field) *
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainenhttp_response_header_get_fields(const struct http_response *resp)
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen{
fb5abffb7097b3c5f167deff6ae293d2f828695bTimo Sirainen if (resp->header == NULL)
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen return NULL;
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen return http_header_get_fields(resp->header);
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen}
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainenbool http_response_has_connection_option(const struct http_response *resp,
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen const char *option);
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainenint http_response_get_payload_size(const struct http_response *resp,
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen uoff_t *size_r);
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen#endif
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen