@@ -17,19 +17,75 @@ #import "OFObject.h" @class OFString; @class OFDictionary; @class OFURL; +@class OFHTTPRequest; @class OFHTTPRequestResult; @class OFDataArray; typedef enum of_http_request_type_t { OF_HTTP_REQUEST_TYPE_GET, OF_HTTP_REQUEST_TYPE_POST, OF_HTTP_REQUEST_TYPE_HEAD } of_http_request_type_t; +/** + * \brief A delegate for OFHTTPRequests. + */ +#ifndef OF_HTTP_REQUEST_M +@protocol OFHTTPRequestDelegate +#else +@protocol OFHTTPRequestDelegate +#endif +#ifdef OF_HAVE_OPTIONAL_PROTOCOLS +@optional +#endif +/** + * This callback is called when the OFHTTPRequest received the headers. + * + * \param request The OFHTTPRequest which received the headers + * \param headers The headers received + * \param statusCode The status code received + */ +- (void)request: (OFHTTPRequest*)request + didReceiveHeaders: (OFDictionary*)headers + withStatusCode: (int)statusCode; + +/** + * This callback is called when the OFHTTPRequest received data. + * + * This is useful for example if you want to update a status display. + * + * \param request The OFHTTPRequest which received data + * \param data The data the OFHTTPRequest received + * \param len The length of the data received, in bytes + */ +- (void)request: (OFHTTPRequest*)request + didReceiveData: (const char*)data + withLength: (size_t)len; + +/** + * This callback is called when the OFHTTPRequest will follow a redirect. + * + * If you want to get the headers and data for each redirect, set the number of + * redirects to 0 and perform a new OFHTTPRequest for each redirect. However, + * this callback will not be called then and you have to look at the status code + * to detect a redirect. + * + * This callback will only be called if the OFHTTPRequest will follow a + * redirect. If the maximum number of redirects has been reached already, this + * callback will not be called. + * + * \param request The OFHTTPRequest which will follow a redirect + * \param url The URL to which it will follow a redirect + * \return A boolean whether the OFHTTPRequest should follow the redirect + */ +- (BOOL)request: (OFHTTPRequest*)request + willFollowRedirectTo: (OFURL*)url; +@end + /** * \brief A class for storing and performing HTTP requests. */ @interface OFHTTPRequest: OFObject { @@ -36,18 +92,20 @@ OFURL *URL; of_http_request_type_t requestType; OFString *queryString; OFDictionary *headers; BOOL redirectsFromHTTPSToHTTPAllowed; + id delegate; } #ifdef OF_HAVE_PROPERTIES @property (copy) OFURL *URL; @property (assign) of_http_request_type_t requestType; @property (copy) OFString *queryString; @property (copy) OFDictionary *headers; @property (assign) BOOL redirectsFromHTTPSToHTTPAllowed; +@property (retain) id delegate; #endif /** * \return A new, autoreleased OFHTTPRequest */ @@ -125,10 +183,22 @@ /** * \return Whether redirects from HTTPS to HTTP are allowed */ - (BOOL)redirectsFromHTTPSToHTTPAllowed; +/** + * Sets the delegate for the HTTP request. + * + * \param delegate The delegate for the HTTP request + */ +- (void)setDelegate: (id )delegate; + +/** + * \return The delegate for the HTTP request. + */ +- (id )delegate; + /** * Performs the HTTP request and returns an OFHTTPRequestResult. * * \return An OFHTTPRequestResult with the result of the HTTP request */ @@ -180,7 +250,10 @@ /** * \return The data returned for the HTTP request */ - (OFDataArray*)data; @end + +@interface OFObject (OFHTTPRequestDelegate) +@end extern Class of_http_request_tls_socket_class;