Address review comments

This commit is contained in:
Federico Stazi 2020-08-07 14:21:00 +00:00
parent 34338411b8
commit 8c68ac221f
5 changed files with 46 additions and 17 deletions

View File

@ -0,0 +1,22 @@
# Curl
This library is a sandboxed version of the original [curl](https://curl.haxx.se/libcurl/c/) C library, implemented using sandboxed-api.
## Supported methods
The library currently supports curl's [*Easy interface*](https://curl.haxx.se/libcurl/c/libcurl-easy.html). According to curl's website:
> The easy interface is a synchronous, efficient, quickly used and... yes, easy interface for file transfers.
> Numerous applications have been built using this.
However, all of the methods using function pointers, are not yet supported.
## Examples
The `examples` directory contains the sandboxed versions of example source codes taken from [this](https://curl.haxx.se/libcurl/c/example.html) page on curl's website.
## Implementation details
Variadic methods are currently not supported by sandboxed-api. Because of this, the sandboxed header `custom_curl.h` wraps the curl library and explicitly defines the variadic methods.
For example, instead of using `curl_easy_setopt`, one of these methods can be used: `curl_easy_setopt_ptr`, `curl_easy_setopt_long` or `curl_easy_setopt_curl_off_t`.

View File

@ -12,11 +12,11 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include "custom_curl.h"
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>
#include "custom_curl.h"
CURLcode curl_easy_setopt_ptr(CURL* handle, CURLoption option, CURLcode curl_easy_setopt_ptr(CURL* handle, CURLoption option,
void* parameter) { void* parameter) {
return curl_easy_setopt(handle, option, parameter); return curl_easy_setopt(handle, option, parameter);

View File

@ -19,16 +19,16 @@
#include <curl/curl.h> #include <curl/curl.h>
extern "C" CURLcode curl_easy_setopt_ptr(CURL *handle, CURLoption option, extern "C" CURLcode curl_easy_setopt_ptr(CURL* handle, CURLoption option,
void* parameter); void* parameter);
extern "C" CURLcode curl_easy_setopt_long(CURL *handle, CURLoption option, extern "C" CURLcode curl_easy_setopt_long(CURL* handle, CURLoption option,
long parameter); long parameter);
extern "C" CURLcode curl_easy_setopt_curl_off_t(CURL *handle, CURLoption option, extern "C" CURLcode curl_easy_setopt_curl_off_t(CURL* handle, CURLoption option,
curl_off_t parameter); curl_off_t parameter);
extern "C" CURLcode curl_easy_getinfo_ptr(CURL *handle, CURLINFO option, extern "C" CURLcode curl_easy_getinfo_ptr(CURL* handle, CURLINFO option,
void* parameter); void* parameter);
#endif // CUSTOM_CURL_H #endif // CUSTOM_CURL_H

View File

@ -12,7 +12,10 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# Example 1: GET request, verbose # All the examples are sandboxed versions of curl's examples
# (https://curl.haxx.se/libcurl/c/example.html)
# Example 1: simple.c
add_executable(example1 add_executable(example1
example1.cc example1.cc
) )

View File

@ -12,6 +12,9 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
// Sandboxed version of simple.c
#include <cstdlib>
#include <iostream> #include <iostream>
#include "curl_sapi.sapi.h" #include "curl_sapi.sapi.h"
@ -30,7 +33,6 @@ class CurlApiSandboxEx1 : public CurlSandbox {
} }
}; };
// GET http://example.com
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
CurlApiSandboxEx1 sandbox; CurlApiSandboxEx1 sandbox;
@ -38,16 +40,11 @@ int main(int argc, char* argv[]) {
assert(status.ok()); assert(status.ok());
CurlApi api(&sandbox); CurlApi api(&sandbox);
sapi::StatusOr<CURL*> status_or_culrptr = api.curl_easy_init(); sapi::StatusOr<CURL*> status_or_curl = api.curl_easy_init();
assert(status.ok()); assert(status_or_curl.ok());
sapi::v::RemotePtr curl(status_or_culrptr.value()); sapi::v::RemotePtr curl(status_or_curl.value());
assert(curl.GetValue()); // checking curl != NULL assert(curl.GetValue()); // Checking curl != NULL
sapi::StatusOr<int> status_or_int =
api.curl_easy_setopt_long(&curl, CURLOPT_VERBOSE, 1l);
assert(status_or_int.ok());
assert(status_or_int.value() == CURLE_OK);
sapi::v::ConstCStr url("http://example.com"); sapi::v::ConstCStr url("http://example.com");
status_or_int = status_or_int =
@ -55,6 +52,11 @@ int main(int argc, char* argv[]) {
assert(status_or_int.ok()); assert(status_or_int.ok());
assert(status_or_int.value() == CURLE_OK); assert(status_or_int.value() == CURLE_OK);
sapi::StatusOr<int> status_or_int =
api.curl_easy_setopt_long(&curl, CURLOPT_FOLLOWLOCATION, 1l);
assert(status_or_int.ok());
assert(status_or_int.value() == CURLE_OK);
status_or_int = api.curl_easy_perform(&curl); status_or_int = api.curl_easy_perform(&curl);
assert(status_or_int.ok()); assert(status_or_int.ok());
assert(status_or_int.value() == CURLE_OK); assert(status_or_int.value() == CURLE_OK);
@ -62,4 +64,6 @@ int main(int argc, char* argv[]) {
status = api.curl_easy_cleanup(&curl); status = api.curl_easy_cleanup(&curl);
assert(status.ok()); assert(status.ok());
return EXIT_SUCCESS;
} }