/* * should use evbuffer_free(evb); to free this evbuffer * */ static struct http_response * http_req(char * ip, int port, char * verb, char * path, char * data){ char port_str[6]; sprintf(port_str, "%d", port); int cs = client_socket(ip, port_str); char * request_buffer = alloca(100 + strlen(path)); // in stack do not need free char response_buffer[1024*8]; sprintf(request_buffer, "%s %s HTTP/1.0\r\nContent-Length: %d\r\n\r\n%s\r\n\r\n", verb, path, strlen(data), data); //sprintf(request_buffer, "GET %s HTTP/1.0\r\nUser-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15\r\n\r\n", path); fprintf(stderr, "%s", request_buffer); int rst = tcptowrite(cs, request_buffer, strlen(request_buffer) , 30000); printf("tcptowrite rst: %d", rst); int readed = 0; struct evbuffer *evb = evbuffer_new(); /*evbuffer_read(evb, cs, 30);*/ while ((readed = tcptoread(cs, response_buffer, 1024*8, 30000)) > 0){ printf("readed len: %d \n", readed); evbuffer_add(evb, response_buffer, readed); } struct evbuffer_ptr evbptr = evbuffer_search(evb, "\r\n\r\n", 4, NULL); struct evbuffer *headers = evbuffer_new(); evbuffer_remove_buffer(evb, headers, evbptr.pos); /*evbuffer_drain(evb, evbptr.pos);*/ tcpclose(cs); int code = parse_response_status_code(headers); return http_response_new(code, headers, evb); }
static inline int32_t mainserv_toread(int sock,uint8_t *ptr,uint32_t leng,uint32_t timeout) { int32_t r; r = tcptoread(sock,ptr,leng,timeout); if (r>0) { mainserv_bytesin(r); } return r; }
int server() { char buffer[1024]; int ss = server_socket("127.0.0.1", "9991"); if (ss < 0) { logging(LOG_ERROR, "socket error!"); return -1; } int ns = tcptoaccept(ss, 100000); if (ns < 0) { logging(LOG_ERROR, "accept error!"); return -1; } tcpnonblock(ns); tcpnodelay(ns); tcptoread(ns, buffer, 10, 3000); /*printf("read ok %d !!\n", n); */ /*printf("read data: \n%s\n", buffer); */ assert(strcmp("helloworl", buffer) == 0); tcpclose(ns); tcpclose(ss); return 0; }
static void* masterproxy_server(void *args) { uint8_t header[8]; uint8_t querybuffer[QUERYSIZE]; uint8_t ansbuffer[ANSSIZE]; uint8_t *wptr; const uint8_t *rptr; int sock = *((int*)args); uint32_t psize,cmd,msgid,asize,acmd; free(args); for (;;) { if (tcptoread(sock,header,8,1000)!=8) { tcpclose(sock); return NULL; } rptr = header; cmd = get32bit(&rptr); psize = get32bit(&rptr); if (cmd==CLTOMA_FUSE_REGISTER) { // special case: register // if (psize>QUERYSIZE) { if (psize!=73) { tcpclose(sock); return NULL; } if (tcptoread(sock,querybuffer,psize,1000)!=(int32_t)(psize)) { tcpclose(sock); return NULL; } if (memcmp(querybuffer,FUSE_REGISTER_BLOB_ACL,64)!=0) { tcpclose(sock); return NULL; } if (querybuffer[64]!=REGISTER_TOOLS) { tcpclose(sock); return NULL; } wptr = ansbuffer; put32bit(&wptr,MATOCL_FUSE_REGISTER); put32bit(&wptr,1); put8bit(&wptr,STATUS_OK); if (tcptowrite(sock,ansbuffer,9,1000)!=9) { tcpclose(sock); return NULL; } } else { if (psize<4 || psize>QUERYSIZE) { tcpclose(sock); return NULL; } if (tcptoread(sock,querybuffer,psize,1000)!=(int32_t)(psize)) { tcpclose(sock); return NULL; } rptr = querybuffer; msgid = get32bit(&rptr); asize = ANSSIZE-12; if (fs_custom(cmd,querybuffer+4,psize-4,&acmd,ansbuffer+12,&asize)!=STATUS_OK) { tcpclose(sock); return NULL; } wptr = ansbuffer; put32bit(&wptr,acmd); put32bit(&wptr,asize+4); put32bit(&wptr,msgid); if (tcptowrite(sock,ansbuffer,asize+12,1000)!=(int32_t)(asize+12)) { tcpclose(sock); return NULL; } } } }