storage/curl: use CURLOPT_POSTFIELDS instead of CURLOPT_READFUNCTION
This commit is contained in:
parent
43348a3e13
commit
73f58c57e8
@ -150,41 +150,6 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* A helper class which feeds a (foreign) memory buffer into the
|
|
||||||
* CURLOPT_READFUNCTION.
|
|
||||||
*/
|
|
||||||
class CurlRequestBody {
|
|
||||||
ConstBuffer<char> data;
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit CurlRequestBody(ConstBuffer<void> _data)
|
|
||||||
:data(ConstBuffer<char>::FromVoid(_data)) {}
|
|
||||||
|
|
||||||
explicit constexpr CurlRequestBody(StringView _data)
|
|
||||||
:data(_data) {}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
CurlRequestBody(CurlRequest &request, T _data)
|
|
||||||
:CurlRequestBody(_data) {
|
|
||||||
request.SetOption(CURLOPT_READFUNCTION, Callback);
|
|
||||||
request.SetOption(CURLOPT_READDATA, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
size_t Read(char *buffer, size_t size) {
|
|
||||||
size_t n = std::min(size, data.size);
|
|
||||||
std::copy_n(data.begin(), n, buffer);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t Callback(char *buffer, size_t size, size_t nitems,
|
|
||||||
void *instream) {
|
|
||||||
auto &rb = *(CurlRequestBody *)instream;
|
|
||||||
return rb.Read(buffer, size * nitems);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The (relevant) contents of a "<D:response>" element.
|
* The (relevant) contents of a "<D:response>" element.
|
||||||
*/
|
*/
|
||||||
@ -253,7 +218,6 @@ ParseU64(const char *s, size_t length)
|
|||||||
*/
|
*/
|
||||||
class PropfindOperation : BlockingHttpRequest, CommonExpatParser {
|
class PropfindOperation : BlockingHttpRequest, CommonExpatParser {
|
||||||
CurlSlist request_headers;
|
CurlSlist request_headers;
|
||||||
CurlRequestBody request_body;
|
|
||||||
|
|
||||||
enum class State {
|
enum class State {
|
||||||
ROOT,
|
ROOT,
|
||||||
@ -270,13 +234,7 @@ class PropfindOperation : BlockingHttpRequest, CommonExpatParser {
|
|||||||
public:
|
public:
|
||||||
PropfindOperation(CurlGlobal &_curl, const char *_uri, unsigned depth)
|
PropfindOperation(CurlGlobal &_curl, const char *_uri, unsigned depth)
|
||||||
:BlockingHttpRequest(_curl, _uri),
|
:BlockingHttpRequest(_curl, _uri),
|
||||||
CommonExpatParser(ExpatNamespaceSeparator{'|'}),
|
CommonExpatParser(ExpatNamespaceSeparator{'|'})
|
||||||
request_body(request,
|
|
||||||
"<?xml version=\"1.0\"?>\n"
|
|
||||||
"<a:propfind xmlns:a=\"DAV:\">"
|
|
||||||
"<a:prop><a:getcontenttype/></a:prop>"
|
|
||||||
"<a:prop><a:getcontentlength/></a:prop>"
|
|
||||||
"</a:propfind>")
|
|
||||||
{
|
{
|
||||||
request.SetOption(CURLOPT_CUSTOMREQUEST, "PROPFIND");
|
request.SetOption(CURLOPT_CUSTOMREQUEST, "PROPFIND");
|
||||||
|
|
||||||
@ -286,6 +244,13 @@ public:
|
|||||||
|
|
||||||
request.SetOption(CURLOPT_HTTPHEADER, request_headers.Get());
|
request.SetOption(CURLOPT_HTTPHEADER, request_headers.Get());
|
||||||
|
|
||||||
|
request.SetOption(CURLOPT_POSTFIELDS,
|
||||||
|
"<?xml version=\"1.0\"?>\n"
|
||||||
|
"<a:propfind xmlns:a=\"DAV:\">"
|
||||||
|
"<a:prop><a:getcontenttype/></a:prop>"
|
||||||
|
"<a:prop><a:getcontentlength/></a:prop>"
|
||||||
|
"</a:propfind>");
|
||||||
|
|
||||||
// TODO: send request body
|
// TODO: send request body
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user