コード例 #1
0
int crawler_crawl(link_crawler_t *crawler, char *url, list_t *link_list)
{
    http_url_t http_url;
    int status = CRAWLER_NULL;
    if(http_url_parse_s(&http_url, url) == URL_RECOGNIZED) {
        int port = strlen(http_url.port) != 0 ? atoi(http_url.port) : 80;
        char path[4096] = {""};
        strlen(http_url.search) == 0 ? sprintf(path, "%s", http_url.path) : sprintf(path, "%s?%s", http_url.path, http_url.search);

        if(http_connect(&crawler->http_client, http_url.host, port) == CONNECT_OK) {
            int ecode, response_status;
            const char *page = NULL;
            printf("%s\n", url);
            ecode = http_do_get(&crawler->http_client, path);
            switch(ecode) {
            case RESPONSE_OK:
                response_status = http_response_status(&crawler->http_client);
                if(response_status == HTTP_OK) {
                    /* get entity_body pointer */
                    page = http_response_body(&crawler->http_client);
                    /* extrack link from buffer and save link into list*/
                    if(page != NULL) {
                        extract_absolute_link_s(page, link_list, url);
                        status = CRAWLER_OK;
                    } else {
                        status = CRAWLER_NULL;
                        fprintf(stderr, "Request %s:%d%s failed, response body is null.\n",
                                crawler->http_client.connection.host,
                                crawler->http_client.connection.port, path);
                    }
                } else {
                    fprintf(stderr, "Request %s:%d%s failed, Status code: %d.\n",
                            crawler->http_client.connection.host,
                            crawler->http_client.connection.port, path, response_status);
                    status = CRAWLER_NONEED;
                }
                break;
            case RESPONSE_OVERFLOW:
                fprintf(stderr, "Request %s:%d%s do_get receive overflow.\n",
                        crawler->http_client.connection.host,
                        crawler->http_client.connection.port, path);
                status = CRAWLER_OVERFLOW;
                break;
            case RESPONSE_FAILED:
                fprintf(stderr, "Request %s:%d%s do_get receive break.\n",
                        crawler->http_client.connection.host,
                        crawler->http_client.connection.port, path);
                status = CRAWLER_BREAK;
                break;
            case RESPONSE_TIMEOUT:
                fprintf(stderr, "Request %s:%d%s do_get receive timeout.\n",
                        crawler->http_client.connection.host,
                        crawler->http_client.connection.port, path);
                status = CRAWLER_TIMEOUT;
                break;
            case REQUEST_FAILED:
                fprintf(stderr, "Request %s:%d%s do_get request failed.\n",
                        http_url.host, port, path);
                status = CRAWLER_FAILED;
                break;
            default:
                fprintf(stderr, "Unknown ecode %d.\n", ecode);
                status = CRAWLER_UNKNOWN;
                break;
            }
            http_disconnect(&crawler->http_client);
        } else {
            fprintf(stderr, "Http connect %s:%d failed.\n", http_url.host, port);
            status = CRAWLER_UNREACH;
        }
    } else {
        fprintf(stderr, "Unrecognize url: %s\n", url);
        status = CRAWLER_UNKNOWN;
    }
    return status;
}
コード例 #2
0
ファイル: cloud_user.c プロジェクト: LXiong/openwrt-rtk
static void message_retrieve_message(void)
{
	int server_socket;
	struct sockaddr_in server_addr;
	char *header, *xml_request, *default_ns;
	char response_buf[1024];
	int read_size;
	struct xml_node *request_root, *auth_node, *id_node, *secrete_node, *proxy_type_node, *proxy_key_node, *period_node;

	char vpn_server_ip[16], cmd_buf[64];
	char *pserver_ip_start=NULL;
	char *pserver_ip_end=NULL;
	int get_server_ip_flag=0;
	
	server_socket = socket(AF_INET, SOCK_STREAM, 0);
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = inet_addr(server_instance);
	server_addr.sin_port = ntohs(CLOUD_PORT);

	if(connect(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
		close(server_socket);
		return;
	}

	//Build XML Request Document Tree
	default_ns = (char *) malloc(strlen("http://") + strlen(server_instance) + strlen("/GenericMessage") + 1);
	sprintf(default_ns, "http://%s/GenericMessage", server_instance);
	request_root = xml_new_element(NULL, "RetrieveMessage", default_ns);
	auth_node = xml_new_element(NULL, "Authentication", NULL);
	id_node = xml_new_element(NULL, "Id", NULL);
	secrete_node = xml_new_element(NULL, "Secrete", NULL);
	proxy_type_node = xml_new_element(NULL, "ProxyType", NULL);
	proxy_key_node = xml_new_element(NULL, "ProxyKey", NULL);
	period_node = xml_new_element(NULL, "AckPeriod", NULL);
	xml_add_child(request_root, auth_node);
	xml_add_child(auth_node, id_node);
	xml_add_child(auth_node, secrete_node);
	xml_add_child(id_node, xml_new_text(device_id));
	xml_add_child(secrete_node, xml_new_text(device_secrete));
	xml_add_child(request_root, proxy_type_node);
	xml_add_child(request_root, proxy_key_node);
	xml_add_child(request_root, period_node);
	xml_add_child(proxy_type_node, xml_new_text("ControllerProxy"));	//ProxyType for controller should be "ControllerProxy"
	xml_add_child(proxy_key_node, xml_new_text(proxy_key));
	xml_add_child(period_node, xml_new_text("30"));	//Set ack period in seconds
	xml_request = xml_dump_tree(request_root);
	xml_delete_tree(request_root);

	//Write HTTP
	header = http_post_header(server_instance, "/cgi-bin/generic_message", "text/xml", (int) strlen(xml_request));
	write(server_socket, header, strlen(header));
	dump_msg("\nsend http header:", header, strlen(header));
	http_free(header);
	write(server_socket, xml_request, strlen(xml_request));
	dump_msg("send xml request:", xml_request, strlen(xml_request));
	xml_free(xml_request);

	//Read HTTP
	while(get_server_ip_flag==0 && (read_size = read(server_socket, response_buf, sizeof(response_buf))) != 0) {
		struct xml_node *response_root;
		struct xml_node_set *node_set;
		char *http_header, *http_body;

		if((http_header = http_response_header(response_buf, read_size)) != NULL) {
			dump_msg("\nrecv http header:", http_header, strlen(http_header));
			http_free(http_header);
		}

		if((http_body = http_response_body(response_buf, read_size)) != NULL) {
			dump_msg("recv http body:", http_body, strlen(http_body));
			http_free(http_body);
		}

		if((response_root = xml_parse_doc(response_buf, read_size, NULL, "RetrieveMessageResponse", default_ns)) != NULL) {
			int has_message = 0;

			node_set = xml_find_path(response_root, "/RetrieveMessageResponse/Message/Id");

			if(node_set->count) {
				struct xml_node *id_text = xml_text_child(node_set->node[0]);

				if(id_text) {
					if(strcmp(id_text->text, device_id) == 0)
						has_message = 1;
				}
			}

			xml_delete_set(node_set);

			if(has_message) {
				node_set = xml_find_path(response_root, "/RetrieveMessageResponse/Message/Content");

				if(node_set->count) {
					struct xml_node *content_node = node_set->node[0];

					if(content_node->child) {
						char *content_buf = xml_dump_tree(content_node->child);
						printf("Receive Application-Dependent Content: %s\n", content_buf);

						if(strncmp(content_buf, "<OpenvpnApplication><ServerIpElement>", strlen("<OpenvpnApplication><ServerIpElement>")) == 0)
						{
							pserver_ip_start=content_buf+strlen("<OpenvpnApplication><ServerIpElement>");
							for(pserver_ip_end=pserver_ip_start; pserver_ip_end!=NULL && *pserver_ip_end!='<'; pserver_ip_end++);
							strncpy(vpn_server_ip, pserver_ip_start, pserver_ip_end-pserver_ip_start);	
							vpn_server_ip[pserver_ip_end-pserver_ip_start]=0;
							printf("Recv VPN Server IP Address: %s\n", vpn_server_ip);
							sprintf(cmd_buf, "echo VpnServerIp:%s > /etc/openvpn/vpn_server_ip", vpn_server_ip);
							system(cmd_buf);
							get_server_ip_flag=1;
							system("/usr/sbin/openvpn_client_start.sh &");
						}
						
						xml_free(content_buf);
					}
				}

				xml_delete_set(node_set);
			}
			else {
				node_set = xml_find_path(response_root, "/RetrieveMessageResponse/Result");

				if(node_set->count) {
					xml_delete_set(node_set);
					xml_delete_tree(response_root);
					break;
				}

				xml_delete_set(node_set);
			}

			xml_delete_tree(response_root);
		}
	}

	free(default_ns);
	close(server_socket);
}
コード例 #3
0
ファイル: crawler.c プロジェクト: drupaltr/siteanalyzer
void * do_crawler(void *item)
{
	char *url_ptr;
	int clientfd ;
	static int pages = 0;
	static int error = 0;
	char *buf = NULL;
	urlq_t *url_list_head = NULL, *p, *p_pre;
	char cur_dir[256];
	hash_table *hash_in, *hash_out;
/*	int tid = pthread_self();*/
	int j = 0;
	int i= 0;
	int pos_found = 0;
	char temp[256];
	int status = 0;
	static int a = 0;
	static int b = 0;
	static int c = 0;
	static int d = 0;
	static int e = 0;
	static int f = 0;
	static int g = 0;
	while(1){	
		pthread_mutex_lock(&mutex);
		while (urlqueue.head_ptr->next == NULL){
			pthread_cond_wait(&ready, &mutex);
		}

		pthread_mutex_lock(&((threadpool_item *)item)->waitlock);
		((threadpool_item *)item)->idle = 0;
		pthread_mutex_unlock(&((threadpool_item *)item)->waitlock);	
		url_ptr = queue_pop(&urlqueue);
		g++;
		pthread_mutex_unlock(&mutex);
		

		pthread_mutex_lock(&mutex);
		/*if not visited, set flag = 1*/
		if(has_visited(hash, url_ptr) == 1){
			pthread_mutex_unlock(&mutex);
			free(url_ptr); 
			pthread_mutex_lock(&((threadpool_item *)item)->waitlock);	
			((threadpool_item *)item)->idle =1;
			pthread_mutex_unlock(&((threadpool_item *)item)->waitlock);
			d++;	
			continue;	
		}
		hash_out = has_url(hash, url_ptr);
		e++;
		pthread_mutex_unlock(&mutex);
		if (hash_out == NULL){
			printf("error\n");
			getchar();
		}
		*temp = '\0';
		cur_dir[0] = '\0';
		strcpy(cur_dir, url_ptr);
		j = strlen(cur_dir);
		for (;cur_dir[j] != '/' && j != 0; j--) ;
		if(j == 0)
			cur_dir[j] = '\0';
		else
			cur_dir[j+1] = '\0';

		for (i = 0; i < 3; i++){
			if((clientfd = open_tcp("127.0.0.1", 80)) < 0){
				close_fd(clientfd);
				continue;
			}

			if( http_do_get(clientfd, rootdir, "127.0.0.1", url_ptr) < 0){
				close_fd(clientfd);
				continue;
			}

			if(recv_line(clientfd, temp) <= 0){
				close_fd(clientfd);
				continue;
			}
			if((status = http_response_status(temp))  == 4){
				printf("%s error %d\n",url_ptr, error++);
				pthread_mutex_lock(&mutex);
				set_status(hash, url_ptr, 4);
				set_webg_status(webg, hash_out, 4);
				pthread_mutex_unlock(&mutex);
			
				pthread_mutex_lock(&((threadpool_item *)item)->waitlock);	
				((threadpool_item *)item)->idle =1;
				pthread_mutex_unlock(&((threadpool_item *)item)->waitlock);	
				close_fd(clientfd);
				break;	
			}
			buf = http_response_body(clientfd);
			close_fd(clientfd);
			break;
		}
		if (status == 4)
			continue;
		if(i == 3){
			pthread_mutex_lock(&((threadpool_item *)item)->waitlock);	
			((threadpool_item *)item)->idle =1;
			pthread_mutex_unlock(&((threadpool_item *)item)->waitlock);	
			close_fd(clientfd);
			continue;	
		}
		if (buf == NULL){
			pthread_mutex_lock(&((threadpool_item *)item)->waitlock);	
			((threadpool_item *)item)->idle =1;
			pthread_mutex_unlock(&((threadpool_item *)item)->waitlock);	
			continue;
		}
		printf("%s pages %d\n", url_ptr,pages++);
		extract_link(buf, cur_dir, &url_list_head);
		free(buf);
		buf = NULL;	
		p = url_list_head->next;
		p_pre = url_list_head;
		while (p != NULL){
			
			if(strcmp(url_ptr, p->url_ptr) == 0){
				p_pre->next = p->next;
				free(p->url_ptr);
				free(p);
				a++;
				p = p_pre->next;
				printf("a= %d, b= %d, c= %d, d= %d, e= %d, f= %d, g= %d\n", a,b,c,d,e,f,g);
				continue;	
			}			
			pthread_mutex_lock(&mutex);
			hash_in = has_url(hash, p->url_ptr);	
			if (hash_in != NULL ){
				insert_edge(webg, hash_in, hash_out);
				pthread_mutex_unlock(&mutex);
				p_pre->next = p->next;
				free(p->url_ptr);
				free(p);
				p = p_pre->next;
				b++;
				printf("a= %d, b= %d, c= %d, d= %d, e= %d, f= %d, g= %d\n", a,b,c,d,e,f,g);
				continue;
			}
			else{
				pos_found = insert_vertex(webg, hash_out, p->url_ptr);
				insert_hash_item(hash, p->url_ptr, pos_found, 0);	
				pthread_mutex_unlock(&mutex);
				c++;
				p_pre = p;
				p = p->next;
				printf("a= %d, b= %d, c= %d, d= %d, e= %d, f= %d, g= %d\n", a,b,c,d,e,f,g);
			}
		}
		
		if(p_pre != url_list_head){
			pthread_mutex_lock(&mutex);
			queue_push(&urlqueue, url_list_head->next, p_pre);
			f++;
			pthread_mutex_unlock(&mutex);
		}
		free(url_list_head);
		p = p_pre = url_list_head = NULL;
	
		pthread_mutex_lock(&((threadpool_item *)item)->waitlock);	
		((threadpool_item *)item)->idle = 1;
		pthread_mutex_unlock(&((threadpool_item *)item)->waitlock);	
/*printf("next time!\n");*/
	}
/*printf("over!\n");*/
	return NULL;	
}
コード例 #4
0
ファイル: cloud_user.c プロジェクト: LXiong/openwrt-rtk
static void message_query_status(char *op, char *time1, char *time2, char *limit)
{
	int server_socket;
	struct sockaddr_in server_addr;
	char *header, *xml_request, *default_ns;
	char response_buf[4096];
	int read_size;
	struct xml_node *request_root, *auth_node, *id_node, *secrete_node, *op_node, *time_node, *time1_node, *time2_node, *limit_node;

	server_socket = socket(AF_INET, SOCK_STREAM, 0);
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = inet_addr(server_instance);
	server_addr.sin_port = ntohs(CLOUD_PORT);

	if(connect(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
		close(server_socket);
		return;
	}

	//Build XML Request Document Tree
	default_ns = (char *) malloc(strlen("http://") + strlen(server_instance) + strlen("/GenericMessage") + 1);
	sprintf(default_ns, "http://%s/GenericMessage", server_instance);
	request_root = xml_new_element(NULL, "QueryStatus", default_ns);
	auth_node = xml_new_element(NULL, "Authentication", NULL);
	id_node = xml_new_element(NULL, "Id", NULL);
	secrete_node = xml_new_element(NULL, "Secrete", NULL);
	op_node = xml_new_element(NULL, "TimeOperation", NULL);
	xml_add_child(request_root, auth_node);
	xml_add_child(auth_node, id_node);
	xml_add_child(auth_node, secrete_node);
	xml_add_child(id_node, xml_new_text(device_id));
	xml_add_child(secrete_node, xml_new_text(device_secrete));
	xml_add_child(request_root, op_node);
	xml_add_child(op_node, xml_new_text(op));

	if(strcmp(op, "TimeRangeBetween") == 0) {
		time_node = xml_new_element(NULL, "TimeRange", NULL);
		xml_add_child(request_root, time_node);
		time1_node = xml_new_element(NULL, "StartTime", NULL);
		time2_node = xml_new_element(NULL, "EndTime", NULL);
		xml_add_child(time_node, time1_node);
		xml_add_child(time_node, time2_node);
		xml_add_child(time1_node, xml_new_text(time1));
		xml_add_child(time2_node, xml_new_text(time2));
	}
	else {
		time_node = xml_new_element(NULL, "Time", NULL);
		xml_add_child(request_root, time_node);
		xml_add_child(time_node, xml_new_text(time1));

		if((strcmp(op, "TimeGreaterThan") == 0) || (strcmp(op, "TimeLessThan") == 0)) {
			limit_node = xml_new_element(NULL, "QueryLimit", NULL);
			xml_add_child(request_root, limit_node);
			xml_add_child(limit_node, xml_new_text(limit));
		}
	}

	xml_request = xml_dump_tree(request_root);
	xml_delete_tree(request_root);

	//Write HTTP
	header = http_post_header(server_instance, "/cgi-bin/generic_message", "text/xml", (int) strlen(xml_request));
	write(server_socket, header, strlen(header));
	dump_msg("\nsend http header:", header, strlen(header));
	http_free(header);
	write(server_socket, xml_request, strlen(xml_request));
	dump_msg("send xml request:", xml_request, strlen(xml_request));
	xml_free(xml_request);

	//Read HTTP
	if((read_size = read(server_socket, response_buf, sizeof(response_buf))) != 0) {
		struct xml_node *response_root;
		struct xml_node_set *node_set;
		char *http_header, *http_body;

		if((http_header = http_response_header(response_buf, read_size)) != NULL) {
			dump_msg("\nrecv http header:", http_header, strlen(http_header));
			http_free(http_header);
		}

		if((http_body = http_response_body(response_buf, read_size)) != NULL) {
			dump_msg("recv http body:", http_body, strlen(http_body));
			http_free(http_body);
		}

		if((response_root = xml_parse_doc(response_buf, read_size, NULL, "QueryStatusResponse", default_ns)) != NULL) {
			node_set = xml_find_path(response_root, "/QueryStatusResponse/Status");

			if(node_set->count) {
				int i;

				for(i = 0; i < node_set->count; i ++) {
					char *status_buf = xml_dump_tree(node_set->node[i]);
					printf("Receive Application-Dependent Statu[%d]: %s\n", i, status_buf);
					xml_free(status_buf);
				}
			}

			xml_delete_set(node_set);
			xml_delete_tree(response_root);
		}
	}

	free(default_ns);
	close(server_socket);
}
コード例 #5
0
ファイル: cloud_user.c プロジェクト: LXiong/openwrt-rtk
static char *loadbalance_lookup_address(void)
{
	int server_socket;
	struct sockaddr_in server_addr;
	char *header, *xml_request, *default_ns, *public_address = NULL;
	char response_buf[1024];
	int read_size, ret = -1;
	struct xml_node *request_root, *auth_node, *id_node, *secrete_node;

	server_socket = socket(AF_INET, SOCK_STREAM, 0);
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = inet_addr(server_instance);
	server_addr.sin_port = ntohs(CLOUD_PORT);

	if(connect(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
		return NULL;

	//Build XML Request Document Tree
	default_ns = (char *) malloc(strlen("http://") + strlen(server_instance) + strlen("/Location") + 1);
	sprintf(default_ns, "http://%s/Location", server_instance);
	request_root = xml_new_element(NULL, "LookupAddress", default_ns);
	auth_node = xml_new_element(NULL, "Authentication", NULL);
	id_node = xml_new_element(NULL, "Id", NULL);
	secrete_node = xml_new_element(NULL, "Secrete", NULL);
	xml_add_child(request_root, auth_node);
	xml_add_child(auth_node, id_node);
	xml_add_child(auth_node, secrete_node);
	xml_add_child(id_node, xml_new_text(device_id));
	xml_add_child(secrete_node, xml_new_text(device_secrete));
	xml_request = xml_dump_tree(request_root);
	xml_delete_tree(request_root);

	//Write HTTP
	header = http_post_header(server_instance, "/cgi-bin/location", "text/xml", (int) strlen(xml_request));
	write(server_socket, header, strlen(header));
	dump_msg("\nsend http header:", header, strlen(header));
	http_free(header);
	write(server_socket, xml_request, strlen(xml_request));
	dump_msg("send xml request:", xml_request, strlen(xml_request));
	xml_free(xml_request);

	//Read HTTP
	if((read_size = read(server_socket, response_buf, sizeof(response_buf))) != 0) {
		struct xml_node *response_root, *address_text;
		struct xml_node_set *node_set;
		char *http_header, *http_body;

		if((http_header = http_response_header(response_buf, read_size)) != NULL) {
			dump_msg("\nrecv http header:", http_header, strlen(http_header));
			http_free(http_header);
		}

		if((http_body = http_response_body(response_buf, read_size)) != NULL) {
			dump_msg("recv http body:", http_body, strlen(http_body));
			http_free(http_body);
		}

		if((response_root = xml_parse_doc(response_buf, read_size, NULL, "LookupAddressResponse", default_ns)) != NULL) {
			node_set = xml_find_path(response_root, "/LookupAddressResponse/PublicAddress");

			if(node_set->count) {
				address_text = xml_text_child(node_set->node[0]);

				if(address_text) {
					public_address = (char *) malloc(strlen(address_text->text) + 1);
					strcpy(public_address, address_text->text);
				}
			}

			xml_delete_set(node_set);
			xml_delete_tree(response_root);
		}
	}

	free(default_ns);
	close(server_socket);

	return public_address;
}
コード例 #6
0
ファイル: cloud_user.c プロジェクト: LXiong/openwrt-rtk
static void message_forward_message(char *application_content, char *timeout)
{
	int server_socket;
	struct sockaddr_in server_addr;
	char *header, *xml_request, *default_ns, *doc_prefix = NULL, *doc_name = NULL, *doc_uri = NULL;
	char response_buf[1024];
	int read_size;
	struct xml_node *request_root, *auth_node, *id_node, *secrete_node, *message_node, *type_node, *content_node, *application_root, *timeout_node;

	if(xml_doc_name(application_content, strlen(application_content), &doc_prefix, &doc_name, &doc_uri) == -1)
		return;

	if((application_root = xml_parse_doc(application_content, strlen(application_content), doc_prefix, doc_name, doc_uri)) == NULL)
		return;

	server_socket = socket(AF_INET, SOCK_STREAM, 0);
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = inet_addr(server_instance);
	server_addr.sin_port = ntohs(CLOUD_PORT);

	if(connect(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
		close(server_socket);
		return;
	}

	//Build XML Request Document Tree
	default_ns = (char *) malloc(strlen("http://") + strlen(server_instance) + strlen("/GenericMessage") + 1);
	sprintf(default_ns, "http://%s/GenericMessage", server_instance);
	request_root = xml_new_element(NULL, "ForwardMessage", default_ns);
	auth_node = xml_new_element(NULL, "Authentication", NULL);
	id_node = xml_new_element(NULL, "Id", NULL);
	secrete_node = xml_new_element(NULL, "Secrete", NULL);
	message_node = xml_new_element(NULL, "Message", NULL);
	type_node = xml_new_element(NULL, "Type", NULL);
	content_node = xml_new_element(NULL, "Content", NULL);
	xml_add_child(request_root, auth_node);
	xml_add_child(auth_node, id_node);
	xml_add_child(auth_node, secrete_node);
	xml_add_child(id_node, xml_new_text(device_id));
	xml_add_child(secrete_node, xml_new_text(device_secrete));
	xml_add_child(request_root, message_node);
	xml_add_child(message_node, type_node);
	xml_add_child(message_node, content_node);
	xml_add_child(type_node, xml_new_text("ToDevice"));	//For controller, Message/Type should be "ToDevice"
	xml_add_child(content_node, application_root);	//Add application document root to request content node as child

	if(timeout != NULL) {
		timeout_node = xml_new_element(NULL, "Timeout", NULL);
		xml_add_child(timeout_node, xml_new_text(timeout));
		xml_add_child(request_root, timeout_node);
	}

	xml_request = xml_dump_tree(request_root);
	xml_delete_tree(request_root);

	//Write HTTP
	header = http_post_header(server_instance, "/cgi-bin/generic_message", "text/xml", (int) strlen(xml_request));
	write(server_socket, header, strlen(header));
	dump_msg("\nsend http header:", header, strlen(header));
	http_free(header);
	write(server_socket, xml_request, strlen(xml_request));
	dump_msg("send xml request:", xml_request, strlen(xml_request));
	xml_free(xml_request);

	//Read HTTP
	if((read_size = read(server_socket, response_buf, sizeof(response_buf))) != 0) {
		struct xml_node *response_root, *instance_text;
		struct xml_node_set *node_set;
		char *http_header, *http_body;

		if((http_header = http_response_header(response_buf, read_size)) != NULL) {
			dump_msg("\nrecv http header:", http_header, strlen(http_header));
			http_free(http_header);
		}

		if((http_body = http_response_body(response_buf, read_size)) != NULL) {
			dump_msg("recv http body:", http_body, strlen(http_body));
			http_free(http_body);
		}
	}

	if(doc_prefix)
		xml_free(doc_prefix);

	if(doc_name)
		xml_free(doc_name);

	if(doc_uri)
		xml_free(doc_uri);

	free(default_ns);
	close(server_socket);
}
コード例 #7
0
ファイル: cloud_user.c プロジェクト: LXiong/openwrt-rtk
static void message_release_proxy(void)
{
	int server_socket;
	struct sockaddr_in server_addr;
	char *header, *xml_request, *default_ns;
	char response_buf[1024];
	int read_size;
	struct xml_node *request_root, *auth_node, *id_node, *secrete_node, *proxy_type_node, *proxy_key_node;

	if((proxy_key == NULL) || (server_instance == NULL))
		return;

	server_socket = socket(AF_INET, SOCK_STREAM, 0);
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = inet_addr(server_instance);
	server_addr.sin_port = ntohs(CLOUD_PORT);

	if(connect(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
		close(server_socket);
		return;
	}

	//Build XML Request Document Tree
	default_ns = (char *) malloc(strlen("http://") + strlen(server_instance) + strlen("/GenericMessage") + 1);
	sprintf(default_ns, "http://%s/GenericMessage", server_instance);
	request_root = xml_new_element(NULL, "ReleaseProxy", default_ns);
	auth_node = xml_new_element(NULL, "Authentication", NULL);
	id_node = xml_new_element(NULL, "Id", NULL);
	secrete_node = xml_new_element(NULL, "Secrete", NULL);
	proxy_type_node = xml_new_element(NULL, "ProxyType", NULL);
	proxy_key_node = xml_new_element(NULL, "ProxyKey", NULL);
	xml_add_child(request_root, auth_node);
	xml_add_child(auth_node, id_node);
	xml_add_child(auth_node, secrete_node);
	xml_add_child(id_node, xml_new_text(device_id));
	xml_add_child(secrete_node, xml_new_text(device_secrete));
	xml_add_child(request_root, proxy_type_node);
	xml_add_child(proxy_type_node, xml_new_text("ControllerProxy"));	//ProxyType for controller should be "ControllerProxy"
	xml_add_child(request_root, proxy_key_node);
	xml_add_child(proxy_key_node, xml_new_text(proxy_key));
	xml_request = xml_dump_tree(request_root);
	xml_delete_tree(request_root);

	//Write HTTP
	header = http_post_header(server_instance, "/cgi-bin/generic_message", "text/xml", (int) strlen(xml_request));
	write(server_socket, header, strlen(header));
	dump_msg("\nsend http header:", header, strlen(header));
	http_free(header);
	write(server_socket, xml_request, strlen(xml_request));
	dump_msg("send xml request:", xml_request, strlen(xml_request));
	xml_free(xml_request);

	//Read HTTP
	if((read_size = read(server_socket, response_buf, sizeof(response_buf))) != 0) {
		struct xml_node *response_root, *instance_text;
		struct xml_node_set *node_set;
		char *http_header, *http_body;

		if((http_header = http_response_header(response_buf, read_size)) != NULL) {
			dump_msg("\nrecv http header:", http_header, strlen(http_header));
			http_free(http_header);
		}

		if((http_body = http_response_body(response_buf, read_size)) != NULL) {
			dump_msg("recv http body:", http_body, strlen(http_body));
			http_free(http_body);
		}
	}

	free(default_ns);
	close(server_socket);
}
コード例 #8
0
int main(int argc, char **argv)
{
    char *host = "125.211.218.8";
   char *path = "/techqq/zt/2007/firacn/topic_html/xsm.htm";
   /*
   char *host = "10.205.42.139";
   char *path = "/techqq/a/20090423/000378.htm";
char *path = "/techqq/a/20120111/000508.htm";
char *path = "/techqq/a/20121008/000013.htm";
    char *path = "/techqq/wlyx.htm";
    char *path = "/techqq/index.html";
    char *path = "/techqq/a/20121008/000048.htm";
10.205.42.139:80/techqq/a/20090423/000378.htm
*/
    const char *body_ptr;
    int status;
    http_client_t http_client1;
    http_connect(&http_client1, host, 80);
    http_do_get(&http_client1, path);
    status = http_response_status(&http_client1);
    body_ptr = http_response_body(&http_client1);
    printf("---------------------Status-----------------------\n");
    printf("%d\n", status);
    printf("---------------------Body-----------------------\n");
    printf("%p\n", body_ptr);
    printf("%s\n", body_ptr);
    http_disconnect(&http_client1);

/*
    status = http_response_status(&http_client1);
    body_ptr = http_response_body(&http_client1);
*/
/*
    printf("---------------------Status-----------------------\n");
    printf("%d\n", status);
    printf("---------------------Body-----------------------\n");
    printf("%s\n", body_ptr);
*/
/*


    http_client_t http_client2;
    http_connect(&http_client2, "ufp.umeng.com", 80);
    http_do_get(&http_client2, "/login");

    status = http_response_status(&http_client2);
    body_ptr = http_response_body(&http_client2);

    printf("---------------------Status-----------------------\n");
    printf("%d\n", status);
    printf("---------------------Body-----------------------\n");
    printf("%s\n", body_ptr);
    http_disconnect(&http_client2);


    http_client_t http_client3;
    http_connect(&http_client3, "blog.umeng.com", 80);
    http_do_get(&http_client3, "/index.php/category/products/");

    status = http_response_status(&http_client3);
    body_ptr = http_response_body(&http_client3);

    printf("---------------------Status-----------------------\n");
    printf("%d\n", status);
    printf("---------------------Body-----------------------\n");
    printf("%s\n", body_ptr);
    http_disconnect(&http_client3);
*/

}