d'nin curl wrapperi berbat. binding kafasiyla yapilmis. tek kelimeyle berbat. ya basit data post edebiliyorsun ya da upload ile dosya gonderebiliyorsun, ikisini birden yapmana izin vermiyor. ben de bunun ustesinden gelebilmek icin basit bir struct yazdim.
import etc.c.curl;
import std.net.curl;
import std.string;
pragma(lib, "curl");
pragma(lib, "ssl");
struct PostForm {
Curl curl;
curl_httppost *formpost;
curl_httppost *lastptr;
curl_slist *headerlist;
string url;
this(string url){
this.url = url;
}
void addHeader(string key, string value) {
headerlist = curl_slist_append(headerlist,
cast(char*)format("%s:%s", key, value));
}
auto addField(string fieldName, string value, bool isFile=false) {
if (isFile) {
curl_formadd(&formpost,
&lastptr,
CurlForm.copyname, fieldName.ptr,
CurlForm.file, value.ptr,
CurlForm.end);
} else {
curl_formadd(&formpost,
&lastptr,
CurlForm.copyname, fieldName.ptr,
CurlForm.copycontents, value.ptr,
CurlForm.end);
}
}
auto post() {
curl.initialize();
curl.set(CurlOption.url, url);
curl.set(CurlOption.post, 1L);
curl.set(CurlOption.httppost, formpost);
curl.set(CurlOption.verbose, 1L);
if (headerlist) {
curl.set(CurlOption.httpheader, headerlist);
}
curl.perform(true);
}
}
kullanimini da su sekilde:
const postURL = "http://127.0.0.1:8080/posts/upload/";
PostForm form = PostForm(postURL);
form.addField("file", filename, true);
form.addField("filename", fixedFileName);
form.post();
hata olustugunda dogru sekilde ele alinmasi var bir tek. onu da libcurl'u tam ogrendikten sonra yapacagim. :) sagolsunlar, curl katkicilari harika bir dokuman ve api hazirlamislar.
soyle olsa daha iyi olur dediginiz yerler var mi?
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]