lib/curl: use File and NativeFile instead of the local OFile
[nit.git] / lib / curl / curl_c.nit
index 1dd3da9..374706a 100644 (file)
 # Binding of C libCurl which allow us to interact with network.
 module curl_c is pkgconfig("libcurl")
 
+intrude import standard::file
+import standard
+
 in "C header" `{
-       #include <stdio.h>
-       #include <stdlib.h>
        #include <curl/curl.h>
 
-       typedef enum {
-               CURLcallbackTypeHeader,
-               CURLcallbackTypeBody,
-               CURLcallbackTypeStream,
-               CURLcallbackTypeRead,
-       } CURLcallbackType;
-
-       typedef struct {
-               CCurlCallbacks delegate;
-               CURLcallbackType type;
-       } CURLCallbackDatas;
-
        typedef struct {
                char *data;
                int len;
@@ -42,25 +31,10 @@ in "C header" `{
 `}
 
 in "C body" `{
-       // Callbacks method for Header, Body, Stream.
-       size_t nit_curl_callback_func(void *buffer, size_t size, size_t count, CURLCallbackDatas *datas){
-               if(datas->type == CURLcallbackTypeHeader){
-                       char *line_c = (char*)buffer;
-                       String line_o = NativeString_to_s_with_copy(line_c);
-                       CCurlCallbacks_header_callback(datas->delegate, line_o);
-               }
-               else if(datas->type == CURLcallbackTypeBody){
-                       char *line_c = (char*)buffer;
-                       String line_o = NativeString_to_s_with_copy(line_c);
-                       CCurlCallbacks_body_callback(datas->delegate, line_o);
-               }
-               else if(datas->type == CURLcallbackTypeStream){
-                       char *line_c = (char*)buffer;
-                       String line_o = NativeString_to_s(line_c);
-                       CCurlCallbacks_stream_callback(datas->delegate, line_o, size, count);
-               }
-               return count;
-       }
+       #include <stdio.h>
+       #include <stdlib.h>
+       #include <string.h>
+
        // Callback method to read datas from buffer.
        size_t nit_curl_callback_read_func(void *buffer, size_t size, size_t count, CURLCallbackReadDatas *datas){
                int len = datas->len - datas->pos;
@@ -71,89 +45,130 @@ in "C body" `{
        }
 `}
 
+redef extern class NativeString
+       private fun native_callback_header(size, count: Int, target: CCurlCallbacks): Int
+       do
+               target.header_callback to_s_with_length(size*count)
+
+               # FIXME we probably should return a value from the user
+               return count
+       end
+
+       private fun native_callback_body(size, count: Int, target: CCurlCallbacks): Int
+       do
+               target.body_callback to_s_with_length(size*count)
+
+               return count
+       end
+
+       private fun native_callback_stream(size, count: Int, target: CCurlCallbacks): Int
+       do
+               target.stream_callback to_s_with_length(size*count)
+
+               return count
+       end
+end
+
 # CURL Extern Type, reproduce CURL low level behaviors
-extern CCurl `{ CURL * `}
+extern class CCurl `{ CURL * `}
        # Constructor, CURL low level initializer
        new easy_init `{ return curl_easy_init(); `}
+
        # Check for correct initialization
-       fun is_init:Bool `{ return (recv != NULL); `}
+       fun is_init: Bool `{ return (self != NULL); `}
+
        # Easy Clean / Release CURL instance
-       fun easy_clean `{ curl_easy_cleanup( recv ); `}
+       fun easy_clean `{ curl_easy_cleanup( self ); `}
+
        # Perform the transfer described by setted options
-       fun easy_perform:CURLCode `{ return curl_easy_perform( recv ); `}
-       # Set options to tell CURL how to behave. Obj parameter type can be Int, Bool, String, OFile, CURLSList.
-       fun easy_setopt(opt: CURLOption, obj: Object):CURLCode
+       fun easy_perform: CURLCode `{ return curl_easy_perform( self ); `}
+
+       # Set options to tell CURL how to behave. Obj parameter type can be Int, Bool, String, FileWriter, CURLSList.
+       fun easy_setopt(opt: CURLOption, obj: Object): CURLCode
        do
                if obj isa Int then return i_setopt_int(opt, obj)
                if obj isa Bool and obj == true then return i_setopt_int(opt, 1)
                if obj isa Bool and obj == false then return i_setopt_int(opt, 0)
                if obj isa String then return i_setopt_string(opt, obj)
-               if obj isa OFile then return i_setopt_file(opt, obj)
+               if obj isa FileWriter then return i_setopt_file(opt, obj._file.as(not null))
                if obj isa CURLSList then return i_setopt_slist(opt, obj)
                return once new CURLCode.unknown_option
        end
-       # Internal method to set options to CURL using OFile parameter.
-       private fun i_setopt_file(opt: CURLOption, fl: OFile):CURLCode `{ return curl_easy_setopt( recv, opt, fl); `}
+
+       # Internal method to set options to CURL using NativeFile parameter.
+       private fun i_setopt_file(opt: CURLOption, file: NativeFile): CURLCode `{
+               return curl_easy_setopt( self, opt, file);
+       `}
+
        # Internal method to set options to CURL using Int parameter.
-       private fun i_setopt_int(opt: CURLOption, num: Int):CURLCode `{ return curl_easy_setopt( recv, opt, num); `}
+       private fun i_setopt_int(opt: CURLOption, num: Int): CURLCode `{ return curl_easy_setopt( self, opt, num); `}
+
        # Internal method to set options to CURL using CURLSList parameter.
-       private fun i_setopt_slist(opt: CURLOption, list: CURLSList):CURLCode `{ return curl_easy_setopt( recv, opt, list); `}
+       private fun i_setopt_slist(opt: CURLOption, list: CURLSList): CURLCode `{ return curl_easy_setopt( self, opt, list); `}
+
        # Internal method to set options to CURL using String parameter.
-       private fun i_setopt_string(opt: CURLOption, str: String):CURLCode import String.to_cstring `{
+       private fun i_setopt_string(opt: CURLOption, str: String): CURLCode import String.to_cstring `{
                char *rStr = String_to_cstring(str);
-               return curl_easy_setopt( recv, opt, rStr);
+               return curl_easy_setopt( self, opt, rStr);
        `}
+
        # Request Chars internal information from the CURL session
-       fun easy_getinfo_chars(opt: CURLInfoChars):nullable CURLInfoResponseString
+       fun easy_getinfo_chars(opt: CURLInfoChars): nullable CURLInfoResponseString
        do
                 var answ = new CURLInfoResponseString
                 if not i_getinfo_chars(opt, answ).is_ok then return null
                 return answ
        end
+
        # Internal method used to get String object information initially knowns as C Chars type
-       private fun i_getinfo_chars(opt: CURLInfoChars, res: CURLInfoResponseString):CURLCode import CURLInfoResponseString.response=, NativeString.to_s_with_copy `{
+       private fun i_getinfo_chars(opt: CURLInfoChars, res: CURLInfoResponseString): CURLCode import CURLInfoResponseString.response=, NativeString.to_s_with_copy `{
                char *r = NULL;
-               CURLcode c = curl_easy_getinfo( recv, opt, &r);
+               CURLcode c = curl_easy_getinfo( self, opt, &r);
                if((c == CURLE_OK) && r != NULL){
                        String ro = NativeString_to_s_with_copy(r);
                        CURLInfoResponseString_response__assign( res, ro);
                }
                return c;
        `}
+
        # Request Long internal information from the CURL session
-       fun easy_getinfo_long(opt: CURLInfoLong):nullable CURLInfoResponseLong
+       fun easy_getinfo_long(opt: CURLInfoLong): nullable CURLInfoResponseLong
        do
                 var answ = new CURLInfoResponseLong
                 if not i_getinfo_long(opt, answ).is_ok then return null
                 return answ
        end
+
        # Internal method used to get Int object information initially knowns as C Long type
-       private fun i_getinfo_long(opt: CURLInfoLong, res: CURLInfoResponseLong):CURLCode import CURLInfoResponseLong.response= `{
+       private fun i_getinfo_long(opt: CURLInfoLong, res: CURLInfoResponseLong): CURLCode import CURLInfoResponseLong.response= `{
                long *r = NULL;
                r = malloc(sizeof(long));
-               CURLcode c = curl_easy_getinfo( recv, opt, r);
+               CURLcode c = curl_easy_getinfo( self, opt, r);
                if((c == CURLE_OK) && r != NULL) CURLInfoResponseLong_response__assign( res, *r);
                free(r);
                return c;
        `}
+
        # Request Double internal information from the CURL session
-       fun easy_getinfo_double(opt: CURLInfoDouble):nullable CURLInfoResponseDouble
+       fun easy_getinfo_double(opt: CURLInfoDouble): nullable CURLInfoResponseDouble
        do
                 var answ = new CURLInfoResponseDouble
                 if not i_getinfo_double(opt, answ).is_ok then return null
                 return answ
        end
+
        # Internal method used to get Int object information initially knowns as C Double type
-       private fun i_getinfo_double(opt: CURLInfoDouble, res: CURLInfoResponseDouble):CURLCode import CURLInfoResponseDouble.response= `{
+       private fun i_getinfo_double(opt: CURLInfoDouble, res: CURLInfoResponseDouble): CURLCode import CURLInfoResponseDouble.response= `{
                double *r = NULL;
                r = malloc(sizeof(double));
-               CURLcode c = curl_easy_getinfo( recv, opt, r);
+               CURLcode c = curl_easy_getinfo( self, opt, r);
                if((c == CURLE_OK) && r != NULL) CURLInfoResponseDouble_response__assign( res, *r);
                free(r);
                return c;
        `}
+
        # Request SList internal information from the CURL session
-       fun easy_getinfo_slist(opt: CURLInfoSList):nullable CURLInfoResponseArray
+       fun easy_getinfo_slist(opt: CURLInfoSList): nullable CURLInfoResponseArray
        do
                var answ = new CURLInfoResponseArray
                if not i_getinfo_slist(opt, answ).is_ok then return null
@@ -161,157 +176,150 @@ extern CCurl `{ CURL * `}
                answ.prim_response.destroy
                return answ
        end
+
        # Internal method used to get Array[String] object information initially knowns as C SList type
-       private fun i_getinfo_slist(opt: CURLInfoSList, res: CURLInfoResponseArray):CURLCode import CURLInfoResponseArray.prim_response=`{
+       private fun i_getinfo_slist(opt: CURLInfoSList, res: CURLInfoResponseArray): CURLCode import CURLInfoResponseArray.prim_response= `{
                struct curl_slist* csl = NULL;
-               CURLcode ce = curl_easy_getinfo( recv, opt, &csl);
+               CURLcode ce = curl_easy_getinfo( self, opt, &csl);
                CURLInfoResponseArray_prim_response__assign(res, csl);
                return ce;
        `}
-       # Register delegate to get callbacks about the CURL transfer performed
-       fun register_callback(delegate: CCurlCallbacks, cbtype: CURLCallbackType):CURLCode
-       do
-               if once [new CURLCallbackType.header, new CURLCallbackType.body, new CURLCallbackType.stream, new CURLCallbackType.read].has(cbtype) then
-                       return i_register_callback(delegate, cbtype)
-               end
-               return once new CURLCode.unknown_option
-       end
+
        # Register delegate to read datas from given buffer
-       fun register_read_datas_callback(delegate: CCurlCallbacks, datas: String):CURLCode
+       fun register_read_datas_callback(delegate: CCurlCallbacks, datas: String): CURLCode
        do
                if datas.length > 0 then return i_register_read_datas_callback(delegate, datas, datas.length)
                return once new CURLCode.unknown_option
        end
+
        # Internal method used to configure read callback
-       private fun i_register_read_datas_callback(delegate: CCurlCallbacks, datas: String, size: Int):CURLCode import String.to_cstring `{
+       private fun i_register_read_datas_callback(delegate: CCurlCallbacks, datas: String, size: Int): CURLCode import String.to_cstring `{
                CURLCallbackReadDatas *d = NULL;
                d = malloc(sizeof(CURLCallbackReadDatas));
                d->data = (char*)String_to_cstring(datas);
                d->len = size;
                d->pos = 0;
-               return curl_easy_setopt( recv, CURLOPT_READDATA, d);
+               return curl_easy_setopt( self, CURLOPT_READDATA, d);
        `}
-       # Internal method used to configure callbacks in terms of given type
-       private fun i_register_callback(delegate: CCurlCallbacks, cbtype: CURLCallbackType):CURLCode is extern import CCurlCallbacks.header_callback, CCurlCallbacks.body_callback, CCurlCallbacks.stream_callback, NativeString.to_s_with_copy, NativeString.to_s `{
-               CURLCallbackDatas *d = malloc(sizeof(CURLCallbackDatas));
+
+       # Register `delegate` to get callbacks about the CURL transfer
+       fun register_callback_header(delegate: CCurlCallbacks): CURLCode
+       import NativeString.native_callback_header `{
+               CURLcode e;
+               CCurlCallbacks_incr_ref(delegate); // FIXME deallocated these when download completes?
+
+               e = curl_easy_setopt(self, CURLOPT_HEADERFUNCTION, (curl_write_callback)&NativeString_native_callback_header);
+               if(e != CURLE_OK) return e;
+
+               e = curl_easy_setopt(self, CURLOPT_WRITEHEADER, delegate);
+               return e;
+       `}
+
+       # Register `delegate` to get callbacks about the CURL transfer
+       fun register_callback_body(delegate: CCurlCallbacks): CURLCode
+       import NativeString.native_callback_body `{
+               CURLcode e;
                CCurlCallbacks_incr_ref(delegate);
-               d->type = cbtype;
-               d->delegate = delegate;
+
+               e = curl_easy_setopt(self, CURLOPT_WRITEFUNCTION, (curl_write_callback)&NativeString_native_callback_body);
+               if(e != CURLE_OK) return e;
+
+               e = curl_easy_setopt(self, CURLOPT_WRITEDATA, delegate);
+               return e;
+       `}
+
+       # Register `delegate` to get callbacks about the CURL transfer
+       fun register_callback_stream(delegate: CCurlCallbacks): CURLCode
+       import NativeString.native_callback_stream `{
                CURLcode e;
-               switch(cbtype){
-                       case CURLcallbackTypeHeader:
-                               e = curl_easy_setopt( recv, CURLOPT_HEADERFUNCTION, (curl_write_callback)&nit_curl_callback_func);
-                               if(e != CURLE_OK) return e;
-                               e = curl_easy_setopt( recv, CURLOPT_WRITEHEADER, d);
-                       break;
-                       case CURLcallbackTypeBody:
-                       case CURLcallbackTypeStream:
-                               e = curl_easy_setopt( recv, CURLOPT_WRITEFUNCTION, (curl_write_callback)&nit_curl_callback_func);
-                               if(e != CURLE_OK) return e;
-                               e = curl_easy_setopt( recv, CURLOPT_WRITEDATA, d);
-                       break;
-                       case CURLcallbackTypeRead:
-                               e = curl_easy_setopt( recv, CURLOPT_READFUNCTION, (curl_write_callback)&nit_curl_callback_read_func);
-                       default:
-                       break;
-               }
+               CCurlCallbacks_incr_ref(delegate);
+
+               e = curl_easy_setopt(self, CURLOPT_WRITEFUNCTION, (curl_write_callback)&NativeString_native_callback_stream);
+               if(e != CURLE_OK) return e;
+
+               e = curl_easy_setopt(self, CURLOPT_WRITEDATA, delegate);
                return e;
        `}
+
+       # Register `delegate` to get callbacks about the CURL transfer
+       fun register_callback_read(delegate: CCurlCallbacks): CURLCode
+       import NativeString.native_callback_stream `{
+               CCurlCallbacks_incr_ref(delegate);
+
+               return curl_easy_setopt(self, CURLOPT_READFUNCTION, (curl_write_callback)&nit_curl_callback_read_func);
+       `}
+
        # Convert given string to URL encoded string
-       fun escape(url: String):String import String.to_cstring, NativeString.to_s_with_copy `{
+       fun escape(url: String): String import String.to_cstring, NativeString.to_s_with_copy `{
                char *orig_url, *encoded_url = NULL;
                orig_url = String_to_cstring(url);
-               encoded_url = curl_easy_escape( recv, orig_url, strlen(orig_url));
+               encoded_url = curl_easy_escape( self, orig_url, strlen(orig_url));
                String b_url = NativeString_to_s_with_copy(encoded_url);
                curl_free(encoded_url);
                return b_url;
        `}
 end
 
-# FILE Extern type, reproduce basic FILE I/O
-extern OFile `{ FILE* `}
-       # Open / Create a file from given name
-       new open(str: NativeString) `{ return fopen(str, "wb"); `}
-       # Check for File validity
-       fun is_valid:Bool `{ return recv != NULL; `}
-       # Internal method to write to the current file
-       private fun n_write(buffer: NativeString, size: Int, count: Int):Int `{ return fwrite(buffer, size, count, recv); `}
-       # Write datas to the current file
-       fun write(buffer: String, size: Int, count: Int):Int
-       do
-               if is_valid == true then return n_write(buffer.to_cstring, size, count)
-               return 0
-       end
-       # Internal method to close the current file
-       private fun n_close:Int `{ return fclose(recv); `}
-       # Close the current file
-       fun close:Bool
-       do
-               if is_valid == true then return n_close == 0
-               return false
-       end
-end
-
 # Interface for internal information callbacks methods
 interface CCurlCallbacks
-       fun header_callback(line: String) is abstract
-       fun body_callback(line: String) is abstract
-       fun stream_callback(buffer: String, size: Int, count: Int) is abstract
-end
-
-# Extern Type to reproduce Enum of available Callback type
-extern CURLCallbackType `{ CURLcallbackType `}
-       new header `{ return CURLcallbackTypeHeader; `}
-       new body `{ return CURLcallbackTypeBody; `}
-       new stream `{ return CURLcallbackTypeStream; `}
-       new read `{ return CURLcallbackTypeRead; `}
-       fun to_i:Int `{ return recv; `}
+       fun header_callback(buffer: String) do end
+       fun body_callback(buffer: String) do end
+       fun stream_callback(buffer: String) do end
 end
 
 # CURL Code binding and helpers
-extern CURLCode `{ CURLcode `}
+extern class CURLCode `{ CURLcode `}
        new unknown_option `{ return CURLE_UNKNOWN_OPTION; `}
        new unsupported_protocol `{ return CURLE_UNSUPPORTED_PROTOCOL; `}
        new ok `{ return CURLE_OK; `}
        new failed_init `{ return CURLE_FAILED_INIT; `}
-       fun code:Int `{ return recv; `}
-       fun is_ok:Bool `{ return recv == CURLE_OK; `}
-       fun is_valid_protocol:Bool `{ return recv == CURLE_UNSUPPORTED_PROTOCOL; `}
-       fun is_valid_init:Bool `{ return recv == CURLE_FAILED_INIT; `}
-       fun to_i:Int do return code end
+
+       fun code: Int `{ return self; `}
+       fun is_ok: Bool `{ return self == CURLE_OK; `}
+       fun is_valid_protocol: Bool `{ return self == CURLE_UNSUPPORTED_PROTOCOL; `}
+       fun is_valid_init: Bool `{ return self == CURLE_FAILED_INIT; `}
+       fun to_i: Int do return code end
        redef fun to_s import NativeString.to_s_with_copy `{
-               char *c = (char*)curl_easy_strerror(recv);
+               char *c = (char*)curl_easy_strerror(self);
                return NativeString_to_s_with_copy(c);
        `}
 end
 
 # Extern Type of the Linked list type of CURL
-extern CURLSList `{ struct curl_slist * `}
+extern class CURLSList `{ struct curl_slist * `}
        # Empty constructor which allow us to avoid the use of Nit NULLABLE type
        private new `{ return NULL; `}
+
        # Constructor allow us to get list instancied by appending an element inside.
        new with_str(s: String) import String.to_cstring `{
                struct curl_slist *l = NULL;
                l = curl_slist_append(l, String_to_cstring(s));
                return l;
        `}
+
        # Check for initialization
-       fun is_init:Bool `{ return (recv != NULL); `}
+       fun is_init: Bool `{ return (self != NULL); `}
+
        # Append an element in the linked list
        fun append(key: String) import String.to_cstring `{
                 char *k = String_to_cstring(key);
-                curl_slist_append(recv, (char*)k);
+                curl_slist_append(self, (char*)k);
        `}
+
        # Internal method to check for reachability of current data
-       private fun i_data_reachable(c: CURLSList):Bool `{ return (c != NULL && c->data != NULL); `}
+       private fun i_data_reachable(c: CURLSList): Bool `{ return (c != NULL && c->data != NULL); `}
+
        # Internal method to check for reachability of next element
-       private fun i_next_reachable(c: CURLSList):Bool `{ return (c != NULL && c->next != NULL); `}
+       private fun i_next_reachable(c: CURLSList): Bool `{ return (c != NULL && c->next != NULL); `}
+
        # Internal method to get current data
-       private fun i_data(c: CURLSList):String import NativeString.to_s `{ return NativeString_to_s(c->data); `}
+       private fun i_data(c: CURLSList): String import NativeString.to_s `{ return NativeString_to_s(c->data); `}
+
        # Internal method to get next element
-       private fun i_next(c: CURLSList):CURLSList `{ return c->next; `}
+       private fun i_next(c: CURLSList): CURLSList `{ return c->next; `}
+
        # Convert current low level List to an Array[String] object
-       fun to_a:Array[String]
+       fun to_a: Array[String]
        do
                var r = new Array[String]
                var cursor = self
@@ -322,8 +330,9 @@ extern CURLSList `{ struct curl_slist * `}
                end
                return r
        end
+
        # Release allocated memory
-       fun destroy `{ curl_slist_free_all(recv); `}
+       fun destroy `{ curl_slist_free_all(self); `}
 end
 
 redef class Collection[E]
@@ -345,33 +354,33 @@ end
 
 # Array Response type of CCurl.easy_getinfo method
 class CURLInfoResponseArray
-       var response:Array[String] = new Array[String]
-       private var prim_response:CURLSList = new CURLSList
+       var response: Array[String] = new Array[String]
+       private var prim_response: CURLSList = new CURLSList
 end
 
 # Long Response type of CCurl.easy_getinfo method
 class CURLInfoResponseLong
-       var response:Int=0
+       var response = 0
 end
 
 # Double Response type of CCurl.easy_getinfo method
 class CURLInfoResponseDouble
-       var response:Int=0
+       var response = 0
 end
 
-# String Response type of CCurl:easy_getinfo method
+# String Response type of CCurl::easy_getinfo method
 class CURLInfoResponseString
-       var response:String = ""
+       var response = ""
 end
 
 # Reproduce Enum of available CURL SList information, used for CCurl.easy_getinfo
-extern CURLInfoSList `{ CURLINFO `}
+extern class CURLInfoSList `{ CURLINFO `}
        new ssl_engines `{ return CURLINFO_SSL_ENGINES; `}
        new cookielist `{ return CURLINFO_COOKIELIST; `}
 end
 
 # Reproduce Enum of available CURL Long information, used for CCurl.easy_getinfo
-extern CURLInfoLong `{ CURLINFO `}
+extern class CURLInfoLong `{ CURLINFO `}
        new response_code `{ return CURLINFO_RESPONSE_CODE; `}
        new header_size `{ return CURLINFO_HEADER_SIZE; `}
        new http_connectcode `{ return CURLINFO_HTTP_CONNECTCODE; `}
@@ -389,11 +398,11 @@ extern CURLInfoLong `{ CURLINFO `}
        new condition_unmet `{ return CURLINFO_CONDITION_UNMET; `}
        new rtsp_client_cseq `{ return CURLINFO_RTSP_CLIENT_CSEQ; `}
        new rtsp_server_cseq `{ return CURLINFO_RTSP_SERVER_CSEQ; `}
-       new rtsp_cseq_recv `{ return CURLINFO_RTSP_CSEQ_RECV; `}
+       new rtsp_cseq_self `{ return CURLINFO_RTSP_CSEQ_RECV; `}
 end
 
 # Reproduce Enum of available CURL Double information, used for CCurl.easy_getinfo
-extern CURLInfoDouble `{ CURLINFO `}
+extern class CURLInfoDouble `{ CURLINFO `}
        new total_time `{ return CURLINFO_TOTAL_TIME; `}
        new namelookup_time `{ return CURLINFO_NAMELOOKUP_TIME; `}
        new connect_time `{ return CURLINFO_CONNECT_TIME; `}
@@ -410,7 +419,7 @@ extern CURLInfoDouble `{ CURLINFO `}
 end
 
 # Reproduce Enum of available CURL Chars information, used for CCurl.easy_getinfo
-extern CURLInfoChars `{ CURLINFO `}
+extern class CURLInfoChars `{ CURLINFO `}
        new content_type `{ return CURLINFO_CONTENT_TYPE; `}
        new effective_url `{ return CURLINFO_EFFECTIVE_URL; `}
        new redirect_url `{ return CURLINFO_REDIRECT_URL; `}
@@ -422,7 +431,7 @@ extern CURLInfoChars `{ CURLINFO `}
 end
 
 # Reproduce Enum of HTTP Status Code
-extern CURLStatusCode `{ int `}
+extern class CURLStatusCode `{ int `}
        new proceed `{ return 100; `}
        new switching_protocols `{ return 101; `}
        new ok `{ return 200; `}
@@ -460,210 +469,314 @@ extern CURLStatusCode `{ int `}
        new service_unavailable `{ return 503; `}
        new gateway_timeout `{ return 504; `}
        new http_version_not_supported `{ return 505; `}
-       fun to_i:Int `{ return recv; `}
+       fun to_i: Int `{ return self; `}
 end
 
 # Reproduce Enum of CURL Options usable, used for CCurl.easy_setopt
-extern CURLOption `{ CURLoption `}
+extern class CURLOption `{ CURLoption `}
+
+       # Behavior options
+
+       # Display verbose information.
+       new verbose `{ return CURLOPT_VERBOSE; `}
+
+       # Include the header in the body output.
+       new header `{ return CURLOPT_HEADER; `}
+
+       # Shut off the progress meter.
+       new no_progress `{ return CURLOPT_NOPROGRESS; `}
+
+       # Do not install signal handlers.
+       new     no_signal `{ return CURLOPT_NOSIGNAL; `}
+
+       # Transfer multiple files according to a file name pattern.
+       new     wild_card_match `{ return CURLOPT_WILDCARDMATCH; `}
+
+       # Callback Options
+
+       # Callback for writing data.
        new write_function `{ return CURLOPT_WRITEFUNCTION; `}
+
+       # Data pointer to pass to the write callback.
        new write_data `{ return CURLOPT_WRITEDATA; `}
-#      new     `{ return CURLOPT_FILE; `}
+
+#      new     `{ return CURLOPT_READFUNCTION; `}
+#      new `{ return CURLOPT_READDATA; `}
+#      new     `{ return CURLOPT_IOCTLFUNCTION; `}
+#      new     `{ return CURLOPT_IOCTLDATA; `}
+#      new     `{ return CURLOPT_SEEKFUNCTION; `}
+#      new     `{ return CURLOPT_SEEKDATA; `}
+#      new     `{ return CURLOPT_SOCKOPTFUNCTION; `}
+#      new     `{ return CURLOPT_SOCKOPTDATA; `}
+#      new     `{ return CURLOPT_OPENSOCKETFUNCTION; `}
+#      new     `{ return CURLOPT_OPENSOCKETDATA; `}
+#      new     `{ return CURLOPT_CLOSESOCKETFUNCTION; `}
+#      new     `{ return CURLOPT_CLOSESOCKETDATA; `}
+#      new     `{ return CURLOPT_PROGRESSFUNCTION; `}
+#      new     `{ return CURLOPT_PROGRESSDATA; `}
+#      new     `{ return CURLOPT_HEADERFUNCTION; `}
+#      new     `{ return CURLOPT_DEBUGFUNCTION; `}
+#      new     `{ return CURLOPT_DEBUGDATA; `}
+#      new     `{ return CURLOPT_SSL_CTX_FUNCTION; `}
+#      new     `{ return CURLOPT_SSL_CTX_DATA; `}
+#      new     `{ return CURLOPT_CONV_TO_NETWORK_FUNCTION; `}
+#      new     `{ return CURLOPT_CONV_FROM_NETWORK_FUNCTION; `}
+#      new     `{ return CURLOPT_CONV_FROM_UTF8_FUNCTION; `}
+#      new     `{ return CURLOPT_INTERLEAVEFUNCTION; `}
+#      new     `{ return CURLOPT_INTERLEAVEDATA; `}
+#      new     `{ return CURLOPT_CHUNK_BGN_FUNCTION; `}
+#      new     `{ return CURLOPT_CHUNK_END_FUNCTION; `}
+#      new     `{ return CURLOPT_CHUNK_DATA; `}
+#      new     `{ return CURLOPT_FNMATCH_FUNCTION; `}
+#      new     `{ return CURLOPT_FNMATCH_DATA; `}
+
+       # Error Options
+
+#      new     `{ return CURLOPT_ERRORBUFFER; `}
+#      new     `{ return CURLOPT_STDERR; `}
+
+       # Fail on HTTP 4xx errors.
+       new fail_on_error `{ return CURLOPT_FAILONERROR; `}
+
+       # Networkd Options
+
+       # URL to work on.
        new url `{ return CURLOPT_URL; `}
-#      new     `{ return CURLOPT_PORT; `}
+
+#      new     `{ return CURLOPT_PROTOCOLS; `}
+#      new     `{ return CURLOPT_REDIR_PROTOCOLS; `}
 #      new     `{ return CURLOPT_PROXY; `}
+#      new     `{ return CURLOPT_PROXYPORT; `}
+#      new     `{ return CURLOPT_PROXYTYPE; `}
+#      new     `{ return CURLOPT_NOPROXY; `}
+#      new     `{ return CURLOPT_HTTPPROXYTUNNEL; `}
+#      new     `{ return CURLOPT_SOCKS5_GSSAPI_SERVICE; `}
+#      new     `{ return CURLOPT_SOCKS5_GSSAPI_NEC; `}
+#      new     `{ return CURLOPT_INTERFACE; `}
+#      new     `{ return CURLOPT_LOCALPORT; `}
+#      new     `{ return CURLOPT_LOCALPORTRANGE; `}
+#      new     `{ return CURLOPT_DNS_CACHE_TIMEOUT; `}
+#      new     `{ return CURLOPT_DNS_USE_GLOBAL_CACHE; `} /* DEPRECATED, do not use! */
+#      new     `{ return CURLOPT_BUFFERSIZE; `}
+#      new     `{ return CURLOPT_PORT; `}
+#      new     `{ return CURLOPT_TCP_NODELAY; `}
+#      new     `{ return CURLOPT_ADDRESS_SCOPE; `}
+#      new     `{ return CURLOPT_TCP_KEEPALIVE; `}
+#      new     `{ return CURLOPT_TCP_KEEPIDLE; `}
+#      new     `{ return CURLOPT_TCP_KEEPINTVL; `}
+
+       # Names and Passwords Options
+
+#      new     `{ return CURLOPT_NETRC; `}
+#      new     `{ return CURLOPT_NETRC_FILE; `}
 #      new     `{ return CURLOPT_USERPWD; `}
 #      new     `{ return CURLOPT_PROXYUSERPWD; `}
-#      new     `{ return CURLOPT_RANGE; `}
-#      new     `{ return CURLOPT_INFILE; `}
-#      new     `{ return CURLOPT_ERRORBUFFER; `}
-#      new     `{ return CURLOPT_WRITEFUNCTION; `}
-#      new     `{ return CURLOPT_READFUNCTION; `}
-#      new     `{ return CURLOPT_TIMEOUT; `}
-#      new     `{ return CURLOPT_INFILESIZE; `}
+
+       new     username `{ return CURLOPT_USERNAME; `}
+       new     password `{ return CURLOPT_PASSWORD; `}
+
+#      new     `{ return CURLOPT_PROXYUSERNAME; `}
+#      new     `{ return CURLOPT_PROXYPASSWORD; `}
+#      new     `{ return CURLOPT_HTTPAUTH; `}
+#      new     `{ return CURLOPT_TLSAUTH_USERNAME; `}
+#      new     `{ return CURLOPT_TLSAUTH_PASSWORD; `}
+#      new     `{ return CURLOPT_PROXYAUTH; `}
+
+       # HTTP Options
+
+#      new     `{ return CURLOPT_AUTOREFERER; `}
+
+       # Accept-Encoding and automatic decompressing data.
+       new     accept_encoding `{ return CURLOPT_ACCEPT_ENCODING; `}
+
+       # Request Transfer-Encoding.
+       new     transfert_encoding `{ return CURLOPT_TRANSFER_ENCODING; `}
+
+       # Follow HTTP redirects.
+       new follow_location `{ return CURLOPT_FOLLOWLOCATION; `}
+
+#      new     `{ return CURLOPT_UNRESTRICTED_AUTH; `}
+#      new     `{ return CURLOPT_MAXREDIRS; `}
+#      new     `{ return CURLOPT_POSTREDIR; `}
+
+       # Issue a HTTP PUT request.
+       new put `{ return CURLOPT_PUT; `}
+
+       # Issue a HTTP POS request.
+       new post `{ return CURLOPT_POST; `}
+
+       # Send a POST with this data.
        new postfields `{ return CURLOPT_POSTFIELDS; `}
+
+#      new     `{ return CURLOPT_POSTFIELDSIZE; `}
+#      new     `{ return CURLOPT_POSTFIELDSIZE_LARGE; `}
+#      new     `{ return CURLOPT_COPYPOSTFIELDS; `}
+#      new     `{ return CURLOPT_HTTPPOST; `}
 #      new     `{ return CURLOPT_REFERER; `}
-#      new     `{ return CURLOPT_FTPPORT; `}
+
+       # User-Agent: header.
        new user_agent  `{ return CURLOPT_USERAGENT; `}
-#      new     `{ return CURLOPT_LOW_SPEED_LIMIT; `}
-#      new     `{ return CURLOPT_LOW_SPEED_TIME; `}
-#      new     `{ return CURLOPT_RESUME_FROM; `}
-#      new     `{ return CURLOPT_COOKIE; `}
+
+       # Custom HTTP headers.
        new httpheader `{ return CURLOPT_HTTPHEADER; `}
-#      new     `{ return CURLOPT_HTTPPOST; `}
-#      new     `{ return CURLOPT_SSLCERT; `}
-#      new     `{ return CURLOPT_KEYPASSWD; `}
-#      new     `{ return CURLOPT_CRLF; `}
-#      new     `{ return CURLOPT_QUOTE; `}
-#      new     `{ return CURLOPT_WRITEHEADER; `}
+
+#      new     `{ return CURLOPT_HTTP200ALIASES; `}
+#      new     `{ return CURLOPT_COOKIE; `}
 #      new     `{ return CURLOPT_COOKIEFILE; `}
-#      new     `{ return CURLOPT_SSLVERSION; `}
-#      new     `{ return CURLOPT_TIMECONDITION; `}
-#      new     `{ return CURLOPT_TIMEVALUE; `}
-#      new     `{ return CURLOPT_CUSTOMREQUEST; `}
-#      new     `{ return CURLOPT_STDERR; `}
+#      new     `{ return CURLOPT_COOKIEJAR; `}
+#      new     `{ return CURLOPT_COOKIESESSION; `}
+#      new     `{ return CURLOPT_COOKIELIST; `}
+
+       # Issue a HTTP GET request.
+       new     get `{ return CURLOPT_HTTPGET; `}
+
+       # HTTP version to use.
+       new http_version `{ return CURLOPT_HTTP_VERSION; `}
+
+#      new     `{ return CURLOPT_IGNORE_CONTENT_LENGTH; `}
+#      new     `{ return CURLOPT_HTTP_CONTENT_DECODING; `}
+#      new     `{ return CURLOPT_HTTP_TRANSFER_DECODING; `}
+
+       # SMTP Options
+
+       # Address of the sender.
+       new     mail_from `{ return CURLOPT_MAIL_FROM; `}
+
+       # Address of the recipients.
+       new     mail_rcpt `{ return CURLOPT_MAIL_RCPT; `}
+
+#      new     `{ return CURLOPT_MAIL_AUTH; `}
+
+       # TFTP Options
+
+#      new     `{ return CURLOPT_TFTP_BLKSIZE; `}
+
+       # FTP Options
+
+#      new     `{ return CURLOPT_FTPPORT; `}
+#      new     `{ return CURLOPT_QUOTE; `}
 #      new     `{ return CURLOPT_POSTQUOTE; `}
-#      new     `{ return CURLOPT_WRITEINFO; `} /* DEPRECATED, do not use! */
-       new verbose `{ return CURLOPT_VERBOSE; `}                       # talk a lot
-       new header `{ return CURLOPT_HEADER; `}                  # throw the header out too
-       new no_progress `{ return CURLOPT_NOPROGRESS; `}         # shut off the progress meter
-       new no_body `{ return CURLOPT_NOBODY; `}                         # use HEAD to get http document
-       new fail_on_error `{ return CURLOPT_FAILONERROR; `}     # no output on http error codes >= 300
-       new upload `{ return CURLOPT_UPLOAD; `}                  # this is an upload
-       new post `{ return CURLOPT_POST; `}                              # HTTP POST method
-       new dir_list_only `{ return CURLOPT_DIRLISTONLY; `}     # bare names when listing directories
-       new append `{ return CURLOPT_APPEND; `}                  # Append instead of overwrite on upload!
-#      new     `{ return CURLOPT_NETRC; `}
-       new follow_location `{ return CURLOPT_FOLLOWLOCATION; `}        # use Location: Luke!
-       new transfert_text `{ return CURLOPT_TRANSFERTEXT; `} # transfer data in text/ASCII format
-       new put `{ return CURLOPT_PUT; `}                                       # HTTP PUT */
-#      new     `{ return CURLOPT_PROGRESSFUNCTION; `}
-#      new     `{ return CURLOPT_PROGRESSDATA; `}
-#      new     `{ return CURLOPT_AUTOREFERER; `}
-#      new     `{ return CURLOPT_PROXYPORT; `}
-#      new     `{ return CURLOPT_POSTFIELDSIZE; `}
-#      new     `{ return CURLOPT_HTTPPROXYTUNNEL; `}
-#      new     `{ return CURLOPT_INTERFACE; `}
-#      new     `{ return CURLOPT_KRBLEVEL; `}
-#      new     `{ return CURLOPT_SSL_VERIFYPEER; `}
-#      new     `{ return CURLOPT_CAINFO; `}
-#      new     `{ return CURLOPT_MAXREDIRS; `}
+#      new     `{ return CURLOPT_PREQUOTE; `}
+
+       # List only.
+       new dir_list_only `{ return CURLOPT_DIRLISTONLY; `}
+
+       # Append to remote file.
+       new append `{ return CURLOPT_APPEND; `}
+
+#      new     `{ return CURLOPT_FTP_USE_EPRT; `}
+#      new     `{ return CURLOPT_FTP_USE_EPSV; `}
+#      new     `{ return CURLOPT_FTP_USE_PRET; `}
+#      new     `{ return CURLOPT_FTP_CREATE_MISSING_DIRS; `}
+#      new     `{ return CURLOPT_FTP_RESPONSE_TIMEOUT; `}
+#      new     `{ return CURLOPT_FTP_ALTERNATIVE_TO_USER; `}
+#      new     `{ return CURLOPT_FTP_SKIP_PASV_IP; `}
+#      new     `{ return CURLOPT_FTPSSLAUTH; `}
+#      new     `{ return CURLOPT_FTP_SSL_CCC; `}
+#      new     `{ return CURLOPT_FTP_ACCOUNT; `}
+#      new     `{ return CURLOPT_FTP_FILEMETHOD; `}
+
+       # RTSP Options
+
+#      new     `{ return CURLOPT_RTSP_REQUEST; `}
+#      new     `{ return CURLOPT_RTSP_SESSION_ID; `}
+#      new     `{ return CURLOPT_RTSP_STREAM_URI; `}
+#      new     `{ return CURLOPT_RTSP_TRANSPORT; `}
+#      new     `{ return CURLOPT_RTSP_CLIENT_CSEQ; `}
+#      new     `{ return CURLOPT_RTSP_SERVER_CSEQ; `}
+
+       # Protocol Options
+
+       # Transfer data in text/ASCII format.
+       new transfert_text `{ return CURLOPT_TRANSFERTEXT; `}
+
+#      new     `{ return CURLOPT_PROXY_TRANSFER_MODE; `}
+#      new     `{ return CURLOPT_CRLF; `}
+#      new     `{ return CURLOPT_RANGE; `}
+#      new     `{ return CURLOPT_RESUME_FROM; `}
+#      new     `{ return CURLOPT_RESUME_FROM_LARGE; `}
+
+       # Issue a custom request/method.
+       new     custom_request `{ return CURLOPT_CUSTOMREQUEST; `}
+
 #      new     `{ return CURLOPT_FILETIME; `}
-#      new     `{ return CURLOPT_TELNETOPTIONS; `}
+
+       # Do not get the body contents.
+       new no_body `{ return CURLOPT_NOBODY; `}
+
+#      new     `{ return CURLOPT_INFILESIZE; `}
+#      new     `{ return CURLOPT_INFILESIZE_LARGE; `}
+
+       # Upload data.
+       new upload `{ return CURLOPT_UPLOAD; `}
+
+#      new     `{ return CURLOPT_MAXFILESIZE; `}
+#      new     `{ return CURLOPT_MAXFILESIZE_LARGE; `}
+#      new     `{ return CURLOPT_TIMECONDITION; `}
+#      new     `{ return CURLOPT_TIMEVALUE; `}
+
+       # Connection Options
+
+#      new     `{ return CURLOPT_TIMEOUT; `}
+#      new     `{ return CURLOPT_TIMEOUT_MS; `}
+#      new     `{ return CURLOPT_LOW_SPEED_LIMIT; `}
+#      new     `{ return CURLOPT_LOW_SPEED_TIME; `}
+#      new     `{ return CURLOPT_MAX_SEND_SPEED_LARGE; `}
+#      new     `{ return CURLOPT_MAX_RECV_SPEED_LARGE; `}
 #      new     `{ return CURLOPT_MAXCONNECTS; `}
-#      new     `{ return CURLOPT_CLOSEPOLICY; `} /* DEPRECATED, do not use! */
 #      new     `{ return CURLOPT_FRESH_CONNECT; `}
 #      new     `{ return CURLOPT_FORBID_REUSE; `}
-#      new     `{ return CURLOPT_RANDOM_FILE; `}
-#      new     `{ return CURLOPT_EGDSOCKET; `}
 #      new     `{ return CURLOPT_CONNECTTIMEOUT; `}
-#      new     `{ return CURLOPT_HEADERFUNCTION; `}
-#      new     `{ return CURLOPT_HTTPGET; `}
-#      new     `{ return CURLOPT_SSL_VERIFYHOST; `}
-#      new     `{ return CURLOPT_COOKIEJAR; `}
-#      new     `{ return CURLOPT_SSL_CIPHER_LIST; `}
-#      new     `{ return CURLOPT_HTTP_VERSION; `}
-#      new     `{ return CURLOPT_FTP_USE_EPSV; `}
+#      new     `{ return CURLOPT_CONNECTTIMEOUT_MS; `}
+#      new     `{ return CURLOPT_IPRESOLVE; `}
+#      new     `{ return CURLOPT_CONNECT_ONLY; `}
+#      new     `{ return CURLOPT_USE_SSL; `}
+#      new     `{ return CURLOPT_RESOLVE; `}
+#      new     `{ return CURLOPT_ACCEPTTIMEOUT_MS; `}
+
+       # SSL and Security Options
+
+#      new     `{ return CURLOPT_SSLCERT; `}
 #      new     `{ return CURLOPT_SSLCERTTYPE; `}
 #      new     `{ return CURLOPT_SSLKEY; `}
 #      new     `{ return CURLOPT_SSLKEYTYPE; `}
+#      new     `{ return CURLOPT_KEYPASSWD; `}
 #      new     `{ return CURLOPT_SSLENGINE; `}
 #      new     `{ return CURLOPT_SSLENGINE_DEFAULT; `}
-#      new     `{ return CURLOPT_DNS_USE_GLOBAL_CACHE; `} /* DEPRECATED, do not use! */
-#      new     `{ return CURLOPT_DNS_CACHE_TIMEOUT; `}
-#      new     `{ return CURLOPT_PREQUOTE; `}
-#      new     `{ return CURLOPT_DEBUGFUNCTION; `}
-#      new     `{ return CURLOPT_DEBUGDATA; `}
-#      new     `{ return CURLOPT_COOKIESESSION; `}
+#      new     `{ return CURLOPT_SSLVERSION; `}
+#      new     `{ return CURLOPT_SSL_VERIFYPEER; `}
+#      new     `{ return CURLOPT_CAINFO; `}
+#      new     `{ return CURLOPT_ISSUERCERT; `}
 #      new     `{ return CURLOPT_CAPATH; `}
-#      new     `{ return CURLOPT_BUFFERSIZE; `}
-#      new     `{ return CURLOPT_NOSIGNAL; `}
-#      new     `{ return CURLOPT_SHARE; `}
-#      new     `{ return CURLOPT_PROXYTYPE; `}
-#      new     `{ return CURLOPT_ACCEPT_ENCODING; `}
-#      new     `{ return CURLOPT_PRIVATE; `}
-#      new     `{ return CURLOPT_HTTP200ALIASES; `}
-#      new     `{ return CURLOPT_UNRESTRICTED_AUTH; `}
-#      new     `{ return CURLOPT_FTP_USE_EPRT; `}
-#      new     `{ return CURLOPT_HTTPAUTH; `}
-#      new     `{ return CURLOPT_SSL_CTX_FUNCTION; `}
-#      new     `{ return CURLOPT_SSL_CTX_DATA; `}
-#      new     `{ return CURLOPT_FTP_CREATE_MISSING_DIRS; `}
-#      new     `{ return CURLOPT_PROXYAUTH; `}
-#      new     `{ return CURLOPT_FTP_RESPONSE_TIMEOUT; `}
-#      new     `{ return CURLOPT_IPRESOLVE; `}
-#      new     `{ return CURLOPT_MAXFILESIZE; `}
-#      new     `{ return CURLOPT_INFILESIZE_LARGE; `}
-#      new     `{ return CURLOPT_RESUME_FROM_LARGE; `}
-#      new     `{ return CURLOPT_MAXFILESIZE_LARGE; `}
-#      new     `{ return CURLOPT_NETRC_FILE; `}
-#      new     `{ return CURLOPT_USE_SSL; `}
-#      new     `{ return CURLOPT_POSTFIELDSIZE_LARGE; `}
-#      new     `{ return CURLOPT_TCP_NODELAY; `}
-#      new     `{ return CURLOPT_FTPSSLAUTH; `}
-#      new     `{ return CURLOPT_IOCTLFUNCTION; `}
-#      new     `{ return CURLOPT_IOCTLDATA; `}
-#      new     `{ return CURLOPT_FTP_ACCOUNT; `}
-#      new     `{ return CURLOPT_COOKIELIST; `}
-#      new     `{ return CURLOPT_IGNORE_CONTENT_LENGTH; `}
-#      new     `{ return CURLOPT_FTP_SKIP_PASV_IP; `}
-#      new     `{ return CURLOPT_FTP_FILEMETHOD; `}
-#      new     `{ return CURLOPT_LOCALPORT; `}
-#      new     `{ return CURLOPT_LOCALPORTRANGE; `}
-#      new     `{ return CURLOPT_CONNECT_ONLY; `}
-#      new     `{ return CURLOPT_CONV_FROM_NETWORK_FUNCTION; `}
-#      new     `{ return CURLOPT_CONV_TO_NETWORK_FUNCTION; `}
-#      new     `{ return CURLOPT_CONV_FROM_UTF8_FUNCTION; `}
-#      new     `{ return CURLOPT_MAX_SEND_SPEED_LARGE; `}
-#      new     `{ return CURLOPT_MAX_RECV_SPEED_LARGE; `}
-#      new     `{ return CURLOPT_FTP_ALTERNATIVE_TO_USER; `}
-#      new     `{ return CURLOPT_SOCKOPTFUNCTION; `}
-#      new     `{ return CURLOPT_SOCKOPTDATA; `}
+#      new     `{ return CURLOPT_CRLFILE; `}
+#      new     `{ return CURLOPT_SSL_VERIFYHOST; `}
+#      new     `{ return CURLOPT_CERTINFO; `}
+#      new     `{ return CURLOPT_RANDOM_FILE; `}
+#      new     `{ return CURLOPT_EGDSOCKET; `}
+#      new     `{ return CURLOPT_SSL_CIPHER_LIST; `}
 #      new     `{ return CURLOPT_SSL_SESSIONID_CACHE; `}
+#      new     `{ return CURLOPT_SSL_OPTIONS; `}
+#      new     `{ return CURLOPT_KRBLEVEL; `}
+#      new     `{ return CURLOPT_GSSAPI_DELEGATION; `}
+
+       # SSH Options
+
 #      new     `{ return CURLOPT_SSH_AUTH_TYPES; `}
+#      new     `{ return CURLOPT_SSH_HOST_PUBLIC_KEY_MD5; `}
 #      new     `{ return CURLOPT_SSH_PUBLIC_KEYFILE; `}
 #      new     `{ return CURLOPT_SSH_PRIVATE_KEYFILE; `}
-#      new     `{ return CURLOPT_FTP_SSL_CCC; `}
-#      new     `{ return CURLOPT_TIMEOUT_MS; `}
-#      new     `{ return CURLOPT_CONNECTTIMEOUT_MS; `}
-#      new     `{ return CURLOPT_HTTP_TRANSFER_DECODING; `}
-#      new     `{ return CURLOPT_HTTP_CONTENT_DECODING; `}
-#      new     `{ return CURLOPT_NEW_FILE_PERMS; `}
-#      new     `{ return CURLOPT_NEW_DIRECTORY_PERMS; `}
-#      new     `{ return CURLOPT_POSTREDIR; `}
-#      new     `{ return CURLOPT_SSH_HOST_PUBLIC_KEY_MD5; `}
-#      new     `{ return CURLOPT_OPENSOCKETFUNCTION; `}
-#      new     `{ return CURLOPT_OPENSOCKETDATA; `}
-#      new     `{ return CURLOPT_COPYPOSTFIELDS; `}
-#      new     `{ return CURLOPT_PROXY_TRANSFER_MODE; `}
-#      new     `{ return CURLOPT_SEEKFUNCTION; `}
-#      new     `{ return CURLOPT_SEEKDATA; `}
-#      new     `{ return CURLOPT_CRLFILE; `}
-#      new     `{ return CURLOPT_ISSUERCERT; `}
-#      new     `{ return CURLOPT_ADDRESS_SCOPE; `}
-#      new     `{ return CURLOPT_CERTINFO; `}
-       new     username `{ return CURLOPT_USERNAME; `}
-       new     password `{ return CURLOPT_PASSWORD; `}
-#      new     `{ return CURLOPT_PROXYUSERNAME; `}
-#      new     `{ return CURLOPT_PROXYPASSWORD; `}
-#      new     `{ return CURLOPT_NOPROXY; `}
-#      new     `{ return CURLOPT_TFTP_BLKSIZE; `}
-#      new     `{ return CURLOPT_SOCKS5_GSSAPI_SERVICE; `}
-#      new     `{ return CURLOPT_SOCKS5_GSSAPI_NEC; `}
-#      new     `{ return CURLOPT_PROTOCOLS; `}
-#      new     `{ return CURLOPT_REDIR_PROTOCOLS; `}
 #      new     `{ return CURLOPT_SSH_KNOWNHOSTS; `}
 #      new     `{ return CURLOPT_SSH_KEYFUNCTION; `}
 #      new     `{ return CURLOPT_SSH_KEYDATA; `}
-       new     mail_from `{ return CURLOPT_MAIL_FROM; `}
-       new     mail_rcpt `{ return CURLOPT_MAIL_RCPT; `}
-#      new     `{ return CURLOPT_FTP_USE_PRET; `}
-#      new     `{ return CURLOPT_RTSP_REQUEST; `}
-#      new     `{ return CURLOPT_RTSP_SESSION_ID; `}
-#      new     `{ return CURLOPT_RTSP_STREAM_URI; `}
-#      new     `{ return CURLOPT_RTSP_TRANSPORT; `}
-#      new     `{ return CURLOPT_RTSP_CLIENT_CSEQ; `}
-#      new     `{ return CURLOPT_RTSP_SERVER_CSEQ; `}
-#      new     `{ return CURLOPT_INTERLEAVEDATA; `}
-#      new     `{ return CURLOPT_INTERLEAVEFUNCTION; `}
-#      new     `{ return CURLOPT_WILDCARDMATCH; `}
-#      new     `{ return CURLOPT_CHUNK_BGN_FUNCTION; `}
-#      new     `{ return CURLOPT_CHUNK_END_FUNCTION; `}
-#      new     `{ return CURLOPT_FNMATCH_FUNCTION; `}
-#      new     `{ return CURLOPT_CHUNK_DATA; `}
-#      new     `{ return CURLOPT_FNMATCH_DATA; `}
-#      new     `{ return CURLOPT_RESOLVE; `}
-#      new     `{ return CURLOPT_TLSAUTH_USERNAME; `}
-#      new     `{ return CURLOPT_TLSAUTH_PASSWORD; `}
-#      new     `{ return CURLOPT_TLSAUTH_TYPE; `}
-#      new     `{ return CURLOPT_TRANSFER_ENCODING; `}
-#      new     `{ return CURLOPT_CLOSESOCKETFUNCTION; `}
-#      new     `{ return CURLOPT_CLOSESOCKETDATA; `}
-#      new     `{ return CURLOPT_GSSAPI_DELEGATION; `}
-#      new     `{ return CURLOPT_DNS_SERVERS; `}
-#      new     `{ return CURLOPT_ACCEPTTIMEOUT_MS; `}
-#      new     `{ return CURLOPT_TCP_KEEPALIVE; `}
-#      new     `{ return CURLOPT_TCP_KEEPIDLE; `}
-#      new     `{ return CURLOPT_TCP_KEEPINTVL; `}
-#      new     `{ return CURLOPT_SSL_OPTIONS; `}
-#      new     `{ return CURLOPT_MAIL_AUTH; `}
+
+       # Other Options
+
+#      new     `{ return CURLOPT_PRIVATE; `}
+#      new     `{ return CURLOPT_SHARE; `}
+#      new     `{ return CURLOPT_NEW_FILE_PERMS; `}
+#      new     `{ return CURLOPT_NEW_DIRECTORY_PERMS; `}
+
+       # TELNET Options
+
+#      new     `{ return CURLOPT_TELNETOPTIONS; `}
 end