Отправка данных обратной связи через HTTPS POST из приложения wxWidgets - PullRequest
2 голосов
/ 05 декабря 2010

У меня есть приложение wxWidgets, и я хотел бы добавить способ предоставления пользователям обратной связи простым (для реализации и использования), надежным, кросс-платформенным и безопасным способом.Использование HTTP POST поверх SSL, кажется, лучше всего соответствует этим требованиям (хотя я рассмотрю ответы, которые предлагают другие подходы).Однако поддержка HTTPS в wxWidgets кажется ограниченной.

Вот некоторые варианты, которые я рассмотрел, и проблемы с ними:

  • wxSMTP : нетПоддержка SSL / TLS, которую я нашел.Полагается, что пользователь имеет правильную конфигурацию почты (sendmail, MAPI).
  • wxHTTP : все, кроме поддержки SSL / HTTPS.
  • wxSSL : всеесли он не был неполным и давно мертвым.
  • wxCURL : все, кроме сложного для сборки / включения (фактически, в настоящее время выпуск не может быть собран).
  • libcurl : просто свяжись с и вызови libcurl напрямую.Это решение, на котором я остановился (и у меня есть работающий прототип), но оно выглядит очень нестандартно, и хотя libcurl является кроссплатформенным, Windows определенно не является его собственной платформой, поэтому она добавляет значительную зависимость и усложняет сборку проекта..

Ответы [ 2 ]

1 голос
/ 09 января 2011

Я решил использовать libCURL, связанный с openssl. Оба пакета доступны в большинстве систем Linux и могут быть довольно легко собраны в Windows и OS X.

Вот пример кода C, который отправляет отзыв:

#include <stdio.h>
#include <string.h>

#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

int main(int argc, char *argv[])
{
  CURL *curl;
  CURLcode res;

  struct curl_httppost *formpost=NULL;
  struct curl_httppost *lastptr=NULL;
  struct curl_slist *headerlist=NULL;
  static const char buf[] = "Expect:";

  curl_global_init(CURL_GLOBAL_ALL);

  /* Fill in the name field */
  curl_formadd(&formpost,
               &lastptr,
               CURLFORM_COPYNAME, "name",
               CURLFORM_COPYCONTENTS, "John Doe",
               CURLFORM_END);

  /* Fill in the comments field */
  curl_formadd(&formpost,
               &lastptr,
               CURLFORM_COPYNAME, "comments",
               CURLFORM_COPYCONTENTS, "using HTTPS POST\nline 2\nline 3",
               CURLFORM_END);

  curl = curl_easy_init();
  /* initalize custom header list (stating that Expect: 100-continue is not
     wanted */
  headerlist = curl_slist_append(headerlist, buf);
  if(curl) {
    /* what URL that receives this POST */
    curl_easy_setopt(curl, CURLOPT_URL, 
        "https://some_host.com/path/feedback.php");

    // Uncomment to disable certificate checks
    //curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
    //curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);

    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
    res = curl_easy_perform(curl);

    printf("Curl result: %d\n", res);

    /* always cleanup */
    curl_easy_cleanup(curl);

    /* then cleanup the formpost chain */
    curl_formfree(formpost);
    /* free slist */
    curl_slist_free_all (headerlist);
  }
  return 0;
}

Это может быть скомпилировано в Linux следующим образом:

gcc post.c -lcurl -o post

Вот пример кода PHP, который принимает этот пост:

<code><?php
    $recipient = "john@some_host.com";
    if (empty($_POST)) {
        // We only accpet POSTs
        header('HTTP/1.0 403 Forbidden');
        exit;
    } else {
        // Handle a POST
        $message .= "Submitted at ".date("F j, Y, g:i a")."\n\n";
        $message .= "Name:\n";
        $message .= $_POST['name']."\n\n";
        $message .= "-------------------------------------------\n\n";
        $message .= "Comments:\n\n";
        $message .= $_POST['comments']."\n\n";
        // Send message to email address
        $sent = mail($recipient, "Feedback", 
            $message, "From: Feedback <noreply@some_host.com>\r\n");

        if ($sent) {
?>
            <html>
            <body>
                Got POST and sent email:
                <pre><? echo $message; ?>
<? PHP } еще { // Вернуть ошибку заголовок («HTTP / 1.0 500 Internal Server Error», true, 500); выход; } } ?>
0 голосов
/ 06 декабря 2010

Boost :: Asio - альтернатива, которую я использовал раньше, даже в приложении wxWidgets.Я использовал его для загрузки файлов раньше (и для этого есть только пример кода), но, к сожалению, не имею (и не могу быстро найти) пример кода для HTTP (S) POST.

Boost:У asio есть «проблема» в том, что это Boost (это либо большая проблема, потому что «тьфу, Boost», либо не проблема «Awesome, Boost!»

...