mirror of https://github.com/vitalif/grive2
added HTTP receiver callback interface
parent
ba737cba29
commit
1e6e6a4347
|
@ -20,9 +20,10 @@
|
||||||
#include "HTTP.hh"
|
#include "HTTP.hh"
|
||||||
|
|
||||||
#include "Download.hh"
|
#include "Download.hh"
|
||||||
// #include "util/SignalHandler.hh"
|
#include "Receivable.hh"
|
||||||
#include "xml/Node.hh"
|
|
||||||
#include "xml/TreeBuilder.hh"
|
// #include "xml/Node.hh"
|
||||||
|
// #include "xml/TreeBuilder.hh"
|
||||||
|
|
||||||
// dependent libraries
|
// dependent libraries
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
@ -317,10 +318,16 @@ std::size_t Agent::HeaderCallback( void *ptr, size_t size, size_t nmemb, Agent *
|
||||||
return size*nmemb ;
|
return size*nmemb ;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t Agent::XmlCallback( void *ptr, size_t size, size_t nmemb, xml::TreeBuilder *tb )
|
// std::size_t Agent::XmlCallback( void *ptr, size_t size, size_t nmemb, xml::TreeBuilder *tb )
|
||||||
|
// {
|
||||||
|
// tb->ParseData( reinterpret_cast<char*>(ptr), size*nmemb ) ;
|
||||||
|
// return size*nmemb ;
|
||||||
|
// }
|
||||||
|
|
||||||
|
std::size_t Agent::Receive( void* ptr, size_t size, size_t nmemb, Receivable *recv )
|
||||||
{
|
{
|
||||||
tb->ParseData( reinterpret_cast<char*>(ptr), size*nmemb ) ;
|
assert( recv != 0 ) ;
|
||||||
return size*nmemb ;
|
return recv->OnData( ptr, size * nmemb ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Agent::Put(
|
std::string Agent::Put(
|
||||||
|
@ -363,6 +370,33 @@ std::string Agent::Put(
|
||||||
return resp ;
|
return resp ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long Agent::Get(
|
||||||
|
const std::string& url,
|
||||||
|
Receivable *dest,
|
||||||
|
const http::Headers& hdr )
|
||||||
|
{
|
||||||
|
CURL *curl = m_pimpl->curl ;
|
||||||
|
|
||||||
|
// set common options
|
||||||
|
::curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
|
||||||
|
::curl_easy_setopt(curl, CURLOPT_HEADER, 0);
|
||||||
|
::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Agent::Receive);
|
||||||
|
::curl_easy_setopt(curl, CURLOPT_WRITEDATA, dest ) ;
|
||||||
|
::curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L ) ;
|
||||||
|
|
||||||
|
SetHeader( hdr ) ;
|
||||||
|
|
||||||
|
CURLcode curl_code = ::curl_easy_perform(curl);
|
||||||
|
|
||||||
|
long http_code = 0;
|
||||||
|
::curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
|
||||||
|
|
||||||
|
if ( curl_code != CURLE_OK )
|
||||||
|
throw Exception( curl_code, http_code, m_pimpl->error ) ;
|
||||||
|
|
||||||
|
return http_code ;
|
||||||
|
}
|
||||||
|
|
||||||
void Agent::SetHeader( const http::Headers& hdr )
|
void Agent::SetHeader( const http::Headers& hdr )
|
||||||
{
|
{
|
||||||
// set headers
|
// set headers
|
||||||
|
|
|
@ -24,16 +24,12 @@
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace gr { namespace xml
|
|
||||||
{
|
|
||||||
class Node ;
|
|
||||||
class TreeBuilder ;
|
|
||||||
} }
|
|
||||||
|
|
||||||
namespace gr { namespace http {
|
namespace gr { namespace http {
|
||||||
|
|
||||||
typedef std::vector<std::string> Headers ;
|
typedef std::vector<std::string> Headers ;
|
||||||
|
|
||||||
|
class Receivable ;
|
||||||
|
|
||||||
std::string Get( const std::string& url, const Headers& hdr = Headers() ) ;
|
std::string Get( const std::string& url, const Headers& hdr = Headers() ) ;
|
||||||
void GetFile(
|
void GetFile(
|
||||||
const std::string& url,
|
const std::string& url,
|
||||||
|
@ -75,7 +71,13 @@ public :
|
||||||
private :
|
private :
|
||||||
static std::string Format( int curl_code, int http_code, const char *err_buf ) ;
|
static std::string Format( int curl_code, int http_code, const char *err_buf ) ;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
/*! \class Agent
|
||||||
|
\brief class to provide HTTP access
|
||||||
|
|
||||||
|
This class provides functions to send HTTP request in many methods (e.g. get, post and put).
|
||||||
|
Normally the HTTP response is returned in a Receivable.
|
||||||
|
*/
|
||||||
class Agent
|
class Agent
|
||||||
{
|
{
|
||||||
public :
|
public :
|
||||||
|
@ -87,15 +89,17 @@ public :
|
||||||
const std::string& data,
|
const std::string& data,
|
||||||
const http::Headers& hdr = http::Headers() ) ;
|
const http::Headers& hdr = http::Headers() ) ;
|
||||||
|
|
||||||
xml::Node GetXml(
|
long Get(
|
||||||
const std::string& url,
|
const std::string& url,
|
||||||
|
Receivable *dest,
|
||||||
const http::Headers& hdr = http::Headers() ) ;
|
const http::Headers& hdr = http::Headers() ) ;
|
||||||
|
|
||||||
std::string RedirLocation() const ;
|
std::string RedirLocation() const ;
|
||||||
|
|
||||||
private :
|
private :
|
||||||
static std::size_t HeaderCallback( void *ptr, size_t size, size_t nmemb, Agent *pthis ) ;
|
static std::size_t HeaderCallback( void *ptr, size_t size, size_t nmemb, Agent *pthis ) ;
|
||||||
static std::size_t XmlCallback( void* ptr, size_t size, size_t nmemb, gr::xml::TreeBuilder* tb ) ;
|
// static std::size_t XmlCallback( void* ptr, size_t size, size_t nmemb, gr::xml::TreeBuilder* tb ) ;
|
||||||
|
static std::size_t Receive( void* ptr, size_t size, size_t nmemb, Receivable *recv ) ;
|
||||||
|
|
||||||
void SetHeader( const http::Headers& hdr ) ;
|
void SetHeader( const http::Headers& hdr ) ;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
grive: an GPL program to sync a local directory with Google Drive
|
||||||
|
Copyright (C) 2012 Wan Wai Ho
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation version 2
|
||||||
|
of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
namespace gr { namespace http {
|
||||||
|
|
||||||
|
class Receivable
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
virtual std::size_t OnData( void *data, std::size_t count ) = 0 ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
} } // end of namespace
|
Loading…
Reference in New Issue