zoukankan      html  css  js  c++  java
  • 利用curl的API进行开发 新风宇宙

     利用curl的API进行开发 2011-06-08 12:22:03

    分类: LINUX

    同事做的一个web系统,想让别人来提交数据,具体操作就是访问一个URL地址,提交用户名和主机等信息。
    而且在这之余,想记下操作的用户ID,因此建议俺搞一个命令行工具来给他用。
      一开始俺想到用system封装CURL,但是这样比较弱智,而且这样做了哪些操作,系统是能够记录下来的,用官方正式一点的话说就是不太安全,有安全隐患,呵呵。
    于是乎,下载了curl的源码,生成命令行工具之后,查看curl源码,结合命令行测试,最终目的,就是怎么把
    1. curl --digest -u user:pass url地址
    转换成另外一个接口,比如
    1. ./auto_http --auth cme:cme -u jigang.djg -n testhost

    这样的,这样做的话,就能够在auto_http的源码中提取uid,IP等等相关信息,而且提交人也不知道我怎么实现提交的,不知道我采用了url,不知道我记录下了他的uid,不知道我们web系统的相关信息。

    实现代码如下:

    1. //---------auto.c----------created by cme
    2. #include <stdio.h>
    3. #include <stdarg.h>
    4. #include <string.h>
    5. #include <curl/curl.h>
    6. #include <stdlib.h>
    7. #include <unistd.h>
    8. #include <sys/types.h>
    9. #define my_setopt(x,y,z) _my_setopt(x, 0, #y, y, z)
    10. #define my_setopt_str(x,y,z) _my_setopt(x, 1, #y, y, z)
    11. static CURLcode _my_setopt(CURL *curl, int str,const char *name, CURLoption tag, ...);
    12. //#define URL "http://account.tbsite.net:9999/api/websubmits?"
    13. #define URL "http://afang.org/cme_digest/?"
    14. int main(int argc, char *argv[])
    15. {
    16.         CURL *curl; 
    17.         CURLcode res; 
    18.     
    19.     char strurl[1024] = {0};
    20.     unsigned int uid = getuid();
    21.         if(argc != 7)
    22.         {
    23.             printf("Usage:%s --auth name:pass -u user -n host\n", argv[0]);
    24.             exit(1);
    25.         }
    26.     
    27.     if (strncmp(argv[1], "--auth", 6) != 0)
    28.     {
    29.         printf("Usage:%s --auth name:pass -u user -n host\n", argv[0]);
    30.             exit(1);
    31.     }
    32.     char * str = strchr (argv[2], ':');
    33.     if (!str)
    34.     {
    35.         printf("Usage:%s --auth name:pass -u user -n host\n", argv[0]);
    36.             exit(1);
    37.     }
    38.     if (strncmp(argv[3], "-u", 2) != 0)
    39.     {
    40.         printf("Usage:%s --auth name:pass -u user -n host\n", argv[0]);
    41.             exit(1);
    42.     }
    43.     if (strncmp(argv[5], "-n", 2) != 0)
    44.     {
    45.         printf("Usage:%s --auth name:pass -u user -n host\n", argv[0]);
    46.             exit(1);
    47.     }
    48.     curl = curl_easy_init(); 
    49.     if(curl!=NULL)
    50.     {
    51.          my_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
    52.         //my_setopt_str(curl, CURLOPT_USERPWD, "cme:cme");
    53.         my_setopt_str(curl, CURLOPT_USERPWD, argv[2]);
    54.             //my_setopt_str(curl, CURLOPT_PROXYUSERPWD, "cne:cme");
    55.         //curl_easy_setopt(curl, CURLOPT_TLSAUTH_USERNAME, "cme");
    56.         //curl_easy_setopt(curl, CURLOPT_TLSAUTH_PASSWORD, "cme");
    57.         sprintf (strurl, "%suser=%s&host=%s&submitby=%u", URL, argv[4], argv[6], uid);
    58.         printf ("get url:%s\n", strurl);
    59.             curl_easy_setopt(curl, CURLOPT_URL, strurl); 
    60.             res = curl_easy_perform(curl);
    61.     }
    62.     return 0;
    63. }
    64. CURLcode _my_setopt(CURL *curl, int str,const char *name, CURLoption tag, ...)
    65. {
    66.   va_list arg;
    67.   CURLcode ret;
    68.   char *bufp;
    69.   char value[256];
    70.   int remark = 0;
    71.   int skip = 0;
    72.   va_start(arg, tag);
    73.   if(tag < CURLOPTTYPE_OBJECTPOINT)
    74.   {
    75.     long lval = va_arg(arg, long);
    76.     snprintf(value, sizeof(value), "%ldL", lval);
    77.     ret = curl_easy_setopt(curl, tag, lval);
    78.     if(!lval)
    79.       skip = 1;
    80.   }
    81.   else if(tag < CURLOPTTYPE_OFF_T) 
    82.   {
    83.     void *pval = va_arg(arg, void *);
    84.     unsigned char *ptr = (unsigned char *)pval;
    85.     // function pointers are never printable 
    86.     if(tag >= CURLOPTTYPE_FUNCTIONPOINT) 
    87.     {
    88.       if(pval) 
    89.       {
    90.         strcpy(value, "functionpointer"); // 'value' fits 256 bytes 
    91.         remark = 1;
    92.       }
    93.       else
    94.         skip = 1;
    95.     }
    96.     else if(pval && str)
    97.       snprintf(value, sizeof(value), "\"%s\"", (char *)ptr);
    98.     else if(pval) 
    99.     {
    100.       strcpy(value, "objectpointer"); // 'value' fits 256 bytes 
    101.       remark = 1;
    102.     }
    103.     else
    104.       skip = 1;
    105.     ret = curl_easy_setopt(curl, tag, pval);
    106.   }
    107.   else 
    108.   {
    109.     curl_off_t oval = va_arg(arg, curl_off_t);
    110.     snprintf(value, sizeof(value),
    111.              "(curl_off_t)%" CURL_FORMAT_CURL_OFF_T, oval);
    112.     ret = curl_easy_setopt(curl, tag, oval);
    113.     if(!oval)
    114.       skip = 1;
    115.   }
    116.   va_end(arg);
    117.   return ret;
    118. }

    总结了下,还是curl的代码写得好,一个operate函数中嵌套了通用的set_opt,甚是好用啊。

    简单的几行代码,就实现了。哈哈。

    附上makefile

    1. default:    
    2.     gcc --g auto.c
    3.     gcc -o auto_http auto.-lcurl
    4. clean:
    5.     rm -fr auto_http *.o



    文章出处:http://blog.chinaunix.net/uid-10163889-id-1641587.html
  • 相关阅读:
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
  • 原文地址:https://www.cnblogs.com/php5/p/2946574.html
Copyright © 2011-2022 走看看