基于libevent2.0的ministored的http框架--client端

来源:互联网 发布:易语言充值源码 编辑:程序博客网 时间:2024/04/30 19:49

转自:http://blog.csdn.net/sunnydogzhou/article/details/6438149


协议啥的都在上一篇日志《基于libevent2.0的ministored的http框架--server端》说啦,client短还是废话少说,直接上代码吧!

包含了put和get的操作以及部分的测试代码,gcc下编译可以直接通过!

 

[cpp] view plaincopy
  1. #include <errno.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <event2/event.h>  
  5. #include <event2/http.h>  
  6. #include <event2/buffer.h>  
  7. #include <event2/http_struct.h>  
  8. #include "base64.h"  
  9. struct request_context  
  10. {  
  11.     struct evhttp_uri *uri;  
  12.     struct event_base *base;  
  13.     struct evhttp_connection *cn;  
  14.     struct evhttp_request *req;  
  15.     struct evbuffer *buffer;  
  16.     int ok;  
  17. };  
  18. static  
  19. void request_callback(struct evhttp_request *req, void *arg);  
  20. static  
  21. int make_request(struct request_context *ctx , const char * method , char * output_data,int len);  
  22. static  
  23. void request_callback(struct evhttp_request *req, void *arg)  
  24. {  
  25.     struct request_context *ctx = (struct request_context *)arg;  
  26.     struct evhttp_uri *new_uri = NULL;  
  27.     const char *new_location = NULL;  
  28.     /* response is ready */  
  29.     switch(req->response_code)  
  30.     {  
  31.     case HTTP_OK:  
  32.     {  
  33.         /*  
  34.          * Response is received. No futher handling is required. 
  35.          * Finish 
  36.          */  
  37.         const char * result = evhttp_find_header(req->input_headers,"result");  
  38.         printf("result:%s/n",result);  
  39.         if( strcmp( result,"MINISTORED_OK") ){  
  40.             ctx->ok =1;    
  41.         }else{  
  42.             ctx -> ok = 0;     
  43.         }  
  44.         event_base_loopexit(ctx->base, 0);  
  45.       
  46.         break;  
  47.     }  
  48.     case HTTP_MOVEPERM:  
  49.     case HTTP_MOVETEMP:  
  50.         break;  
  51.     default:  
  52.         /* FAILURE */  
  53.         event_base_loopexit(ctx->base, 0);  
  54.         return;  
  55.     }  
  56.     evbuffer_add_buffer(ctx->buffer, req->input_buffer);  
  57.     /* SUCCESS */  
  58.     ctx->ok = 1;  
  59. }  
  60. void context_free(struct request_context *ctx)  
  61. {  
  62.     evhttp_connection_free(ctx->cn);  
  63.     event_base_free(ctx->base);  
  64.     if (ctx->buffer)  
  65.         evbuffer_free(ctx->buffer);  
  66.     evhttp_uri_free(ctx->uri);  
  67.     free(ctx);  
  68. }  
  69. struct request_context *create_context(const char *url ,const char * method, char * output_data,int len)  
  70. {  
  71.     struct request_context *ctx = 0;  
  72.     ctx = calloc(1, sizeof(*ctx));  
  73.     if (!ctx)  
  74.         return 0;  
  75.     ctx->uri = evhttp_uri_parse(url);  
  76.     if (!ctx->uri)  
  77.         return 0;  
  78.     ctx->base = event_base_new();  
  79.     if (!ctx->base)  
  80.         return 0;  
  81.     ctx->buffer = evbuffer_new();  
  82.     make_request(ctx, method , output_data , len );  
  83.     return ctx;  
  84. }  
  85. static  
  86. int make_request(struct request_context *ctx ,const char * method, char * output_data,int len )  
  87. {  
  88.     /* free connections & request */  
  89.     if (ctx->cn)  
  90.         evhttp_connection_free(ctx->cn);  
  91.       
  92.     const char * host = evhttp_uri_get_host(ctx->uri);     
  93.     int port = evhttp_uri_get_port(ctx->uri);  
  94.     ctx->cn = evhttp_connection_base_new(  
  95.         ctx->base, NULL,   
  96.         host,  
  97.         port != -1 ? port : 80);  
  98.     ctx->req = evhttp_request_new(request_callback, ctx);  
  99.     evhttp_add_header(ctx->req->output_headers,"method",method);  
  100.     evbuffer_add(ctx->req->output_buffer,output_data,len);  
  101.     evhttp_make_request(ctx->cn, ctx->req, EVHTTP_REQ_POST, "/");  
  102.     evhttp_add_header(ctx->req->output_headers,  
  103.                             "Host", host);  
  104.     return 0;  
  105. }  
  106. struct evbuffer * ministored_put( const char * url,void* key,int key_size, void * value,int value_size){  
  107.     char * data = (char *) malloc(sizeof(char) * (key_size + value_size +1) );  
  108.     memset(data,'/0',key_size + value_size +1);  
  109.     memcpy(data,key,key_size);  
  110.     memcpy(data + key_size,value,value_size);  
  111.       
  112.     char * encoded_data = (char * ) malloc ( sizeof(char ) * (key_size + value_size) * 2);  
  113.     memset( encoded_data ,'/0',(key_size + value_size) *2);  
  114.     int encoded_len = encode( data, key_size + value_size,encoded_data);      
  115.       
  116.     free(data);  
  117.     struct request_context *ctx = create_context(url,"put",encoded_data,encoded_len );  
  118.     if (!ctx){  
  119.         free(encoded_data);  
  120.         return 0;  
  121.     }  
  122.     /* do all of the job */  
  123.     event_base_dispatch(ctx->base);  
  124.     struct evbuffer *retval = 0;  
  125.     if (ctx->ok)  
  126.     {  
  127.         retval = ctx->buffer;  
  128.         ctx->buffer = 0;  
  129.     }  
  130.       
  131.     free(encoded_data);  
  132.     context_free(ctx);  
  133.     return retval;  
  134. }  
  135. struct evbuffer * ministored_get( const char * url,void* key,int key_size){  
  136.     char * data = (char *) malloc(sizeof(char) * (key_size +1) );  
  137.     memset(data,'/0',key_size +1);  
  138.     memcpy(data,key,key_size);  
  139.     char * encoded_data = (char * ) malloc ( sizeof(char ) * key_size  * 2);  
  140.     memset( encoded_data ,'/0',key_size  *2);  
  141.     int encoded_len = encode( data, key_size ,encoded_data);      
  142.       
  143.     struct request_context *ctx = create_context(url,"get",encoded_data , encoded_len );  
  144.     if (!ctx)  
  145.         return 0;  
  146.     /* do all of the job */  
  147.     event_base_dispatch(ctx->base);  
  148.     struct evbuffer *retval = 0;  
  149.     if (ctx->ok)  
  150.     {  
  151.         retval = ctx->buffer;  
  152.         ctx->buffer = 0;  
  153.     }  
  154.     context_free(ctx);  
  155.     return retval;  
  156. }  
  157. int main(int argc, char *argv[])  
  158. {  
  159.     const char *uri= "http://192.168.1.200:1314/";  
  160.     long key =11111111111111L;  
  161.     long value=22222222222L;  
  162.     struct evbuffer *data = ministored_put(uri,&key,8,&value,8);  
  163.     int len = -1;  
  164.     if( NULL != data)  
  165.         len = evbuffer_get_length(data);  
  166.     printf("got %d bytes/n", len);  
  167.     if (data)  
  168.     {  
  169.         const char *joined = evbuffer_pullup(data, -1);  
  170.         write(1, joined, evbuffer_get_length(data));  
  171.         evbuffer_free(data);  
  172.     }  
  173.     printf("================================================/n");  
  174.     struct evbuffer *get_data = ministored_get(uri,&key,8);  
  175.     int get_len = -1;  
  176.     if( NULL != get_data)  
  177.         get_len = evbuffer_get_length(get_data);  
  178.     printf("got %d bytes/n", get_len);  
  179.     if (get_data)  
  180.     {  
  181.         char *joined = evbuffer_pullup(get_data, -1);  
  182.         write(1, joined, evbuffer_get_length(get_data));  
  183.           
  184.         long value ;  
  185.         char *decoded_data = (char *) malloc (sizeofchar ) * (8+1));  
  186.         memset(decoded_data,'/0',8+1);  
  187.         decode(joined,get_len,decoded_data);  
  188.         memcpy(&value,decoded_data,8);  
  189.         printf("value:%ld/n",value);  
  190.         free( decoded_data);  
  191.         evbuffer_free(get_data);  
  192.     }  
  193.     return 0;  
  194. }  


原创粉丝点击