HttpRequest: docs and memory management fixes

* Now takes ownership of headers, form data and input data
 * Split Set* and Adopt* methods to help with proper use of this (Set
does a copy)
 * Write documentation.
This commit is contained in:
Adrien Destugues 2013-10-17 14:10:23 +02:00
parent 106b257edd
commit 25b034e99c
3 changed files with 206 additions and 12 deletions
docs/user/net
headers/os/net
src/kits/network/libnetapi

@ -0,0 +1,164 @@
/*
* Copyright 2013 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Adrien Destugues, pulkomandy@pulkomandy.tk
*
* Corresponds to:
* headers/os/net/HttpRequest.h rev 46234
* src/kits/network/libnetapi/HttpRequest.cpp rev 46242
*/
/*!
\file HttpRequest.h
\ingroup network
\brief Management of HTTP or HTTPS protocol requests
*/
/*!
\class BHttpRequest
\ingroup network
\brief Handles a request over HTTP or HTTPS
Instances of ths class wil lbe created by the \ref BUrlProtocolRoster for
\ref BUrl with the "http" or "https" protocol. The HTTP protocol is
implemented as specified in RFC2616. The request headers and body can be
customized, then sent to the server. The reply is then parsed and made
available to the application.
This class only implements the client-side part of HTTP, it can't be used
to build an HTTP server.
*/
/*!
\fn void BHttpRequest::SetMethod(const char* method)
\brief Set the HTTP method.
You can use either one of the standard methods (B_HTTP_GET is the default)
or a custom one. The standard methods are B_HTTP_GET, B_HTTP_POST,
B_HTTP_PUT, B_HTTP_DELETE, B_HTTP_HEAD, B_HTTP_OPTIONS, B_HTTP_TRACE and
B_HTTP_CONNECT.
*/
/*!
\fn void BHttpRequest::SetFollowLocation(bool follow)
\brief Enable or disable following HTTP redirects
An HTTP server can redirect a request to another address, either on the
same host or elseswhere. When FollowLocation is set (the default), these
redirections will be followed until an actual page (or an error) is found.
When it is unset, the redirection will not be followed and will be reported
to the client.
*/
/*!
\fn void BHttpRequest::SetMaxRedirections(int8 maxRedirections)
\brief Set the maximal number of redirections to follow before giving up
This is only useful when \ref SetFollowLocation is enabled. It will abort
the request after the given number of redirections. This avoids and helps
diagnosing redirection cycles, where two addresses redirect to each other.
The default is to follow at most 8 redirections before giving up.
*/
/*!
\fn void BHttpRequest::SetReferred(const BString& referrer)
\brief Set the referrer
The referrer is a string sent to the server in the "Referrer:" HTTP header
field. It helps the server know where the request comes from. When
following a link in an HTML page, this is usually set to the URL of that
page.
*/
/*!
\fn void BHttpRequest::SetUserAgent(const BString& userAgent)
\brief Set the user agent
The user agent is an identifier for the client sending an HTTP request.
Some servers will use this to send different content depending on the
software asking for a page.
The default user agent is "Services Kit (Haiku)".
*/
/*!
\fn void BHttpRequest::SetHeaders(const BHttpHeaders& headers)
\brief Set the HTTP headers
This method replaces the whole set of headers for this request with a copy
of the given ones.
\param headers the header template to copy from.
*/
/*!
\fn void BHttpRequest::AdoptHeaders(BHttpHeaders* const headers)
\brief Set the HTTP headers
This method replaces the whole set of headers for this request. It takes
ownership of the parameter, which must not be used afterwards.
*/
/*
\fn void BHttpRequest::SetDiscardDate(bool discard)
This is currently unused.
*/
/*
\fn void BHttpRequest::DisableListener(bool disable)
This is currently unused.
*/
/*!
\fn void BHttpRequest::SetAutoReferrer(bool enable)
\brief Automatically set the referrer when the request is done.
This allows HttpRequest to manage the referrer automatically. Each request
will set the referrer to its own URL so the next request automatically
uses that one.
*/
/*!
\fn void BHttpRequest::SetPostFields(const BHttpForm& fields)
\brief Set the fields for form POST data
Replaces the content of the request with a copy of the given POST fields.
*/
/*!
\fn void BHttpRequest::AdoptPostFields(BHttpForm* const fields)
\brief Set the fields for form POST data
Replaces the content of the request with the given POST fields.
This method takes ownership of the given form, which must not be used
elsewhere afterwards.
*/
/*!
\fn void BHttpRequest::AdoptInputData(BDataIO* const data, const ssize_t size = -1)
\brief Set the request body
If the size is -1 (the default), the data will be sent using chunked
transfers. If the size is known, it will be sent using the Content-Length
header and non-chunked mode.
You should set the size whenever possible, as some servers will not handle
chunked mode properly in all cases.
This method takes ownership of the data, which must not be used elsewhere.
*/
/*!
\fn void BHttpRequest::SetUserName(const BString& userName)
\brief Set the user name for HTTP authentication.
*/
/*!
\fn void BHttpRequest::SetPassword(const BString& password)
\brief Set the user password for HTTP authentication.
*/

@ -34,15 +34,20 @@ public:
void SetMaxRedirections(int8 maxRedirections);
void SetReferrer(const BString& referrer);
void SetUserAgent(const BString& agent);
void SetHeaders(BHttpHeaders* headers);
void SetDiscardData(bool discard);
void SetDisableListener(bool disable);
void SetAutoReferrer(bool enable);
void SetPostFields(BHttpForm* fields);
void SetInputData(BDataIO* data, ssize_t size = -1);
void SetUserName(const BString& name);
void SetPassword(const BString& password);
void SetPostFields(const BHttpForm& fields);
void SetHeaders(const BHttpHeaders& headers);
void AdoptPostFields(BHttpForm* const fields);
void AdoptInputData(BDataIO* const data,
const ssize_t size = -1);
void AdoptHeaders(BHttpHeaders* const headers);
static bool IsInformationalStatusCode(int16 code);
static bool IsSuccessStatusCode(int16 code);
static bool IsRedirectionStatusCode(int16 code);

@ -39,6 +39,7 @@ BHttpRequest::BHttpRequest(const BUrl& url, BUrlResult& result, bool ssl,
fHttpVersion(B_HTTP_11),
fRequestStatus(kRequestInitialState),
fOptHeaders(NULL),
fOptPostFields(NULL),
fOptInputData(NULL),
fOptInputDataSize(-1),
fOptFollowLocation(true)
@ -54,6 +55,10 @@ BHttpRequest::BHttpRequest(const BUrl& url, BUrlResult& result, bool ssl,
BHttpRequest::~BHttpRequest()
{
delete fSocket;
delete fOptInputData;
delete fOptHeaders;
delete fOptPostFields;
}
@ -92,13 +97,6 @@ BHttpRequest::SetUserAgent(const BString& agent)
}
void
BHttpRequest::SetHeaders(BHttpHeaders* headers)
{
fOptHeaders = headers;
}
void
BHttpRequest::SetDiscardData(bool discard)
{
@ -121,8 +119,31 @@ BHttpRequest::SetAutoReferrer(bool enable)
void
BHttpRequest::SetPostFields(BHttpForm* fields)
BHttpRequest::SetHeaders(const BHttpHeaders& headers)
{
AdoptHeaders(new BHttpHeaders(headers));
}
void
BHttpRequest::AdoptHeaders(BHttpHeaders* const headers)
{
delete fOptHeaders;
fOptHeaders = headers;
}
void
BHttpRequest::SetPostFields(const BHttpForm& fields)
{
AdoptPostFields(new BHttpForm(fields));
}
void
BHttpRequest::AdoptPostFields(BHttpForm* const fields)
{
delete fOptPostFields;
fOptPostFields = fields;
if (fOptPostFields != NULL)
@ -131,8 +152,9 @@ BHttpRequest::SetPostFields(BHttpForm* fields)
void
BHttpRequest::SetInputData(BDataIO* data, ssize_t size)
BHttpRequest::AdoptInputData(BDataIO* const data, const ssize_t size)
{
delete fOptInputData;
fOptInputData = data;
fOptInputDataSize = size;
}
@ -226,6 +248,9 @@ BHttpRequest::StatusString(status_t threadStatus) const
void
BHttpRequest::_ResetOptions()
{
delete fOptPostFields;
delete fOptHeaders;
fOptFollowLocation = true;
fOptMaxRedirs = 8;
fOptReferer = "";