extensions/curl/curlapi.cpp
author Asher Baker <asherkin@gmail.com>
Thu Apr 26 16:58:18 2012 +0100 (2012-04-26)
changeset 3488 bee90c8ef6c3
parent 2554 ce7f3b1b0529
child 3919 116256b519b5
permissions -rw-r--r--
Fixed client serials not being unique on Windows (bug 5285, r=psychonic).
dvander@2519
     1
#include "curlapi.h"
dvander@2519
     2
dvander@2519
     3
Webternet g_webternet;
dvander@2519
     4
dvander@2554
     5
WebForm::WebForm() : first(NULL), last(NULL), lastError(CURL_FORMADD_OK)
dvander@2554
     6
{
dvander@2554
     7
}
dvander@2554
     8
dvander@2554
     9
bool WebForm::AddString(const char *name, const char *data)
dvander@2554
    10
{
dvander@2554
    11
	lastError = curl_formadd(&first,
dvander@2554
    12
		&last,
dvander@2554
    13
		CURLFORM_COPYNAME,
dvander@2554
    14
		name,
dvander@2554
    15
		CURLFORM_COPYCONTENTS,
dvander@2554
    16
		data,
dvander@2554
    17
		CURLFORM_END);
dvander@2554
    18
	return lastError == CURL_FORMADD_OK;
dvander@2554
    19
}
dvander@2554
    20
dvander@2554
    21
curl_httppost *WebForm::GetFormData()
dvander@2554
    22
{
dvander@2554
    23
	return first;
dvander@2554
    24
}
dvander@2554
    25
dvander@2554
    26
WebForm::~WebForm()
dvander@2554
    27
{
dvander@2554
    28
	curl_formfree(first);
dvander@2554
    29
}
dvander@2554
    30
dvander@2519
    31
WebTransfer *WebTransfer::CreateWebSession()
dvander@2519
    32
{
dvander@2519
    33
	CURL *curl;
dvander@2519
    34
dvander@2519
    35
	curl = curl_easy_init();
dvander@2519
    36
	if (curl == NULL)
dvander@2519
    37
	{
dvander@2519
    38
		return NULL;
dvander@2519
    39
	}
dvander@2519
    40
dvander@2519
    41
	WebTransfer *easy = new WebTransfer(curl);
dvander@2519
    42
	
dvander@2519
    43
	if (curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, easy->errorBuffer))
dvander@2519
    44
	{
dvander@2519
    45
		delete easy;
dvander@2519
    46
		return NULL;
dvander@2519
    47
	}
dvander@2519
    48
	curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
dvander@2519
    49
	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
dvander@2519
    50
dvander@2519
    51
	return easy;
dvander@2519
    52
}
dvander@2519
    53
dvander@2519
    54
WebTransfer::WebTransfer(CURL *_curl)
dvander@2519
    55
{
dvander@2519
    56
	this->curl = _curl;
dvander@2519
    57
}
dvander@2519
    58
dvander@2519
    59
const char *WebTransfer::LastErrorMessage()
dvander@2519
    60
{
dvander@2519
    61
	return errorBuffer;
dvander@2519
    62
}
dvander@2519
    63
dvander@2519
    64
int WebTransfer::LastErrorCode()
dvander@2519
    65
{
dvander@2519
    66
	return lastError;
dvander@2519
    67
}
dvander@2519
    68
dvander@2519
    69
bool WebTransfer::SetHeaderReturn(bool recv_hdr)
dvander@2519
    70
{
dvander@2519
    71
	lastError = curl_easy_setopt(curl, CURLOPT_HEADER, recv_hdr ? 1 : 0);
dvander@2519
    72
	return lastError == 0;
dvander@2519
    73
}
dvander@2519
    74
dvander@2554
    75
bool WebTransfer::SetFailOnHTTPError(bool fail)
dvander@2554
    76
{
dvander@2554
    77
	lastError = curl_easy_setopt(curl, CURLOPT_FAILONERROR, fail ? 1 : 0);
dvander@2554
    78
	return lastError == 0;
dvander@2554
    79
}
dvander@2554
    80
dvander@2519
    81
static size_t curl_write_to_sm(void *ptr, size_t bytes, size_t nmemb, void *stream)
dvander@2519
    82
{
dvander@2519
    83
	void **userdata = (void **)stream;
dvander@2519
    84
	IWebTransfer *session = (IWebTransfer *)userdata[0];
dvander@2519
    85
	ITransferHandler *handler = (ITransferHandler *)userdata[1];
dvander@2519
    86
dvander@2519
    87
	DownloadWriteStatus status;
dvander@2519
    88
	status = handler->OnDownloadWrite(session, userdata[2], ptr, bytes, nmemb);
dvander@2519
    89
	if (status != DownloadWrite_Okay)
dvander@2519
    90
	{
dvander@2519
    91
		/* Return a differing amount */
dvander@2519
    92
		return (bytes == 0 || nmemb == 0) ? 1 : 0;
dvander@2519
    93
	}
dvander@2519
    94
dvander@2519
    95
	return bytes * nmemb;
dvander@2519
    96
}
dvander@2519
    97
dvander@2519
    98
bool WebTransfer::Download(const char *url, ITransferHandler *handler, void *data)
dvander@2519
    99
{
dvander@2519
   100
	lastError = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_write_to_sm);
dvander@2519
   101
	if (lastError)
dvander@2519
   102
	{
dvander@2519
   103
		return false;
dvander@2519
   104
	}
dvander@2519
   105
dvander@2519
   106
	void *userdata[3];
dvander@2519
   107
	userdata[0] = this;
dvander@2519
   108
	userdata[1] = handler;
dvander@2519
   109
	userdata[2] = data;
dvander@2519
   110
	lastError = curl_easy_setopt(curl, CURLOPT_WRITEDATA, userdata);
dvander@2519
   111
	if (lastError)
dvander@2519
   112
	{
dvander@2519
   113
		return false;
dvander@2519
   114
	}
dvander@2519
   115
dvander@2554
   116
	lastError = curl_easy_setopt(curl, CURLOPT_HTTPPOST, NULL);
dvander@2554
   117
	if (lastError)
dvander@2554
   118
	{
dvander@2554
   119
		return false;
dvander@2554
   120
	}
dvander@2554
   121
dvander@2519
   122
	lastError = curl_easy_setopt(curl, CURLOPT_URL, url);
dvander@2519
   123
	if (lastError)
dvander@2519
   124
	{
dvander@2519
   125
		return false;
dvander@2519
   126
	}
dvander@2519
   127
dvander@2519
   128
	lastError = curl_easy_perform(curl);
dvander@2519
   129
	
dvander@2519
   130
	return (lastError == 0);
dvander@2519
   131
}
dvander@2519
   132
dvander@2554
   133
bool WebTransfer::PostAndDownload(const char *url,
dvander@2554
   134
								  IWebForm *form,
dvander@2554
   135
								  ITransferHandler *handler,
dvander@2554
   136
								  void *data)
dvander@2554
   137
{
dvander@2554
   138
	WebForm *realform = (WebForm*)form;
dvander@2554
   139
dvander@2554
   140
	lastError = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_write_to_sm);
dvander@2554
   141
	if (lastError)
dvander@2554
   142
	{
dvander@2554
   143
		return false;
dvander@2554
   144
	}
dvander@2554
   145
dvander@2554
   146
	void *userdata[3];
dvander@2554
   147
	userdata[0] = this;
dvander@2554
   148
	userdata[1] = handler;
dvander@2554
   149
	userdata[2] = data;
dvander@2554
   150
	lastError = curl_easy_setopt(curl, CURLOPT_WRITEDATA, userdata);
dvander@2554
   151
	if (lastError)
dvander@2554
   152
	{
dvander@2554
   153
		return false;
dvander@2554
   154
	}
dvander@2554
   155
dvander@2554
   156
	lastError = curl_easy_setopt(curl, CURLOPT_HTTPPOST, realform->GetFormData());
dvander@2554
   157
	if (lastError)
dvander@2554
   158
	{
dvander@2554
   159
		return false;
dvander@2554
   160
	}
dvander@2554
   161
dvander@2554
   162
	lastError = curl_easy_setopt(curl, CURLOPT_URL, url);
dvander@2554
   163
	if (lastError)
dvander@2554
   164
	{
dvander@2554
   165
		return false;
dvander@2554
   166
	}
dvander@2554
   167
dvander@2554
   168
	lastError = curl_easy_perform(curl);
dvander@2554
   169
dvander@2554
   170
	return (lastError == 0);
dvander@2554
   171
}
dvander@2554
   172
dvander@2519
   173
WebTransfer::~WebTransfer()
dvander@2519
   174
{
dvander@2519
   175
	curl_easy_cleanup(curl);
dvander@2519
   176
}
dvander@2519
   177
dvander@2519
   178
unsigned int Webternet::GetInterfaceVersion()
dvander@2519
   179
{
dvander@2519
   180
	return SMINTERFACE_WEBTERNET_VERSION;
dvander@2519
   181
}
dvander@2519
   182
dvander@2519
   183
const char *Webternet::GetInterfaceName()
dvander@2519
   184
{
dvander@2519
   185
	return SMINTERFACE_WEBTERNET_NAME;
dvander@2519
   186
}
dvander@2519
   187
dvander@2519
   188
IWebTransfer *Webternet::CreateSession()
dvander@2519
   189
{
dvander@2519
   190
	return WebTransfer::CreateWebSession();
dvander@2519
   191
}
dvander@2519
   192
dvander@2554
   193
IWebForm *Webternet::CreateForm()
dvander@2554
   194
{
dvander@2554
   195
	return new WebForm();
dvander@2554
   196
}