예제 #1
0
파일: ghttp.c 프로젝트: program-fans/shiyan
int ghttp_download_file(char *path, char *url)
{
	ghttp_request *request = NULL;
	FILE * pFile=NULL;
	char *buf=NULL;
	int ret = 0;

	ghttp_status req_status;
	ghttp_proc req_proc;
	int bytes_read=0,recvbytes=0;
	int status_code=0;
	char *redirect = NULL;
#if GHTTP_DEBUG
	char *tmp_pchar = NULL;
#endif

	request = ghttp_request_new();
	if( ghttp_set_uri(request, url) < 0 ){
			ghttpDebug("invalid url: %s \n", url);
       		ret = -1;
			goto END;
	}
	
	if(!path)
		path = ghttp_get_resource_name(request);
	if(!path)
		path = "httpget.html";
	
	pFile = fopen ( path , "wb" );
	if(pFile == NULL){
		ghttpDebug("error: %s [%s]\n", strerror(errno), path);
		ret = -2;
		goto END;
	}
	ghttpDebug("host: %s \n", ghttp_get_host(request));
	if( ghttp_set_type(request, ghttp_type_get) < 0 ){
    		ret = -3;
		goto END;
	}
	if (ghttp_set_sync(request, ghttp_async) < 0){
		ret = -3;
		goto END;
	}
	if( ghttp_prepare(request) < 0 ){
		ret = -3;
		goto END;
	}

	do
	{
		req_status = ghttp_process(request);
		if( req_status == ghttp_error ){
			ghttpDebug("%s \n", ghttp_get_error(request));
			ret = -4;
			goto END;
		}
		else
		{
			if( req_status == ghttp_done )
			{
				status_code = ghttp_status_code(request);
				if(status_code != 200){
					fclose(pFile);
					pFile = NULL;
					break;
				}
			}

			req_proc = ghttp_get_proc(request);
			if( req_proc == ghttp_proc_response || req_proc == ghttp_proc_done )
			{
			#if GHTTP_DEBUG
				if( !tmp_pchar )
				{
					tmp_pchar = (char *)ghttp_get_header(request, "Content-Length");
					ghttpDebug("Content-Length: %s \n", tmp_pchar ? tmp_pchar : "null");
					tmp_pchar = (char *)ghttp_get_header(request, "Transfer-Encoding");
					ghttpDebug("Transfer-Encoding: %s \n", tmp_pchar ? tmp_pchar : "null");
					tmp_pchar = (char *)ghttp_get_header(request, "Content-Encoding");
					ghttpDebug("Content-Encoding: %s \n", tmp_pchar ? tmp_pchar : "null");
					tmp_pchar = (char *)1;
					
					ghttpDebug("recvbytes: ");
				}
			#endif
			
				ghttp_flush_response_buffer(request);
				if(ghttp_get_body_len(request) > 0)
				{
					buf = ghttp_get_body(request);
					bytes_read = ghttp_get_body_len(request);
					recvbytes += bytes_read;
					if(buf)
						fwrite(buf,bytes_read,1,pFile);
				}

				ghttpDebug("%d", recvbytes);
			}
		}
	}while (req_status == ghttp_not_done);

	//ret = status_code;
	switch(status_code)
	{
	case 200:
	default:
		break;
	case 302:
		buf = (char *)ghttp_get_header(request, "Location");
		if(buf){
			redirect = (char *)malloc(strlen(buf)+1);
			if(redirect == NULL){
				ret = -1;
				goto END;
			}
			strcpy(redirect, buf);
		}
		break;
	}
	
END:
	ghttp_request_destroy(request);
    	if(pFile)
		fclose(pFile);
	if(redirect){
		ghttpDebug("redirect: %s \n", redirect);
		ret = ghttp_download_file(path, redirect);
		free(redirect);
	}
	
	return ret;
}
예제 #2
0
파일: ghttp.c 프로젝트: program-fans/shiyan
int ghttp_post_work(ghttp_request *request, struct ghttp_result *result, struct ghttp_post_data *data)
{
	int ret = 0;
	ghttp_status req_status;
	ghttp_proc req_proc;
	int status_code = 0;
//	ghttp_request *redirect_request;
//	char *redirect = NULL, *buf = NULL;

	#if GHTTP_DEBUG
	char *tmp_pchar = NULL;
	#endif

	if(!request || !data)
		return -1;
	ghttp_set_type(request, ghttp_type_post);
	ghttp_set_sync(request, ghttp_async);
	if( ghttp_prepare(request) < 0 ){
		ret = -3;
		goto END;
	}

	do
	{
		req_status = ghttp_process(request);
		if( req_status == ghttp_error ){
			ghttpDebug("%s \n", ghttp_get_error(request));
			ret = -3;
			goto END;
		}
		else
		{
			if(req_status == ghttp_next ){
				data->post_data_func(request, data);
			}
			if( req_status == ghttp_done )
			{
				status_code = ghttp_status_code(request);
				if(status_code != 200){
					ghttp_result_recv_finish(request, result);
					break;
				}
			}

			req_proc = ghttp_get_proc(request);
			if( req_proc == ghttp_proc_response || req_proc == ghttp_proc_done )
			{
			#if GHTTP_DEBUG
				if( !tmp_pchar )
				{
					tmp_pchar = (char *)ghttp_get_header(request, "Content-Length");
					ghttpDebug("Content-Length: %s \n", tmp_pchar ? tmp_pchar : "null");
					tmp_pchar = (char *)ghttp_get_header(request, "Transfer-Encoding");
					ghttpDebug("Transfer-Encoding: %s \n", tmp_pchar ? tmp_pchar : "null");
					tmp_pchar = (char *)ghttp_get_header(request, "Content-Encoding");
					ghttpDebug("Content-Encoding: %s \n", tmp_pchar ? tmp_pchar : "null");
					tmp_pchar = (char *)ghttp_get_header(request, "Content-Type");
					ghttpDebug("Content-Type: %s \n", tmp_pchar ? tmp_pchar : "null");
					tmp_pchar = (char *)1;
				}
			#endif
				ghttp_result_recv(request, result);
			}
		}
	}while (req_status == ghttp_not_done);
	
END:
	ghttpDebug("http_code: %d \n", status_code);
	if(ret == 0 && (status_code < 200 || status_code >= 300))
		ret = -3;
	if(result)
		result->http_code = status_code;
	ghttp_result_recv_finish(request, result);

	ghttp_request_destroy(request);
	
	return ret;
}
예제 #3
0
파일: ghttp.c 프로젝트: program-fans/shiyan
int ghttp_get_work(ghttp_request *request, struct ghttp_result *result)
{
	int ret = 0;
	ghttp_status req_status;
	ghttp_proc req_proc;
	int status_code = 0;
	ghttp_request *redirect_request;
	char *redirect = NULL, *buf = NULL;

	#if GHTTP_DEBUG
	char *tmp_pchar = NULL;
	#endif

	if(!request)
		return -1;
	ghttp_set_type(request, ghttp_type_get);
	ghttp_set_sync(request, ghttp_async);
	if( ghttp_prepare(request) < 0 ){
		ret = -3;
		goto END;
	}

	do
	{
		req_status = ghttp_process(request);
		if( req_status == ghttp_error ){
			ghttpDebug("%s \n", ghttp_get_error(request));
			ret = -3;
			goto END;
		}
		else
		{
			if( req_status == ghttp_done )
			{
				status_code = ghttp_status_code(request);
				if(status_code != 200){
					ghttp_result_recv_finish(request, result);
					break;
				}
			}

			req_proc = ghttp_get_proc(request);
			if( req_proc == ghttp_proc_response || req_proc == ghttp_proc_done )
			{
			#if GHTTP_DEBUG
				if( !tmp_pchar )
				{
					tmp_pchar = (char *)ghttp_get_header(request, "Content-Length");
					ghttpDebug("Content-Length: %s \n", tmp_pchar ? tmp_pchar : "null");
					tmp_pchar = (char *)ghttp_get_header(request, "Transfer-Encoding");
					ghttpDebug("Transfer-Encoding: %s \n", tmp_pchar ? tmp_pchar : "null");
					tmp_pchar = (char *)ghttp_get_header(request, "Content-Encoding");
					ghttpDebug("Content-Encoding: %s \n", tmp_pchar ? tmp_pchar : "null");
					tmp_pchar = (char *)ghttp_get_header(request, "Content-Type");
					ghttpDebug("Content-Type: %s \n", tmp_pchar ? tmp_pchar : "null");
					tmp_pchar = (char *)1;
				}
			#endif
				ghttp_result_recv(request, result);
			}
		}
	}while (req_status == ghttp_not_done);
	
	switch(status_code)
	{
	case 200:
	default:
		break;
	case 302:
		buf = (char *)ghttp_get_header(request, "Location");
		if(buf){
			redirect = (char *)malloc(strlen(buf)+1);
			if(redirect == NULL){
				ret = -2;
				goto END;
			}
			strcpy(redirect, buf);
		}
		break;
	}
	
END:
	if(result)
		result->http_code = status_code;
	ghttp_result_recv_finish(request, result);
	
	if(redirect){
		ghttpDebug("redirect: %s \n", redirect);
		redirect_request = ghttp_request_redirect(request, redirect);
		ghttp_request_destroy(request);
		free(redirect);
		ret = ghttp_get_work(redirect_request, ghttp_result_clean(result));
	}
	else
		ghttp_request_destroy(request);
	
	return ret;
}
예제 #4
0
int get_http_request(char * url, char * result, int result_len){
	
	int64 post_begin = get_tick_count();
	
	ghttp_request * request = ghttp_request_new();
	if(!request){
		log_out(log_error, "http_get::ghttp_request_new fail\n");
		return -1;
	}

	if(ghttp_set_uri(request, (char*)url) == -1){
		log_out(log_error, "http_get::ghttp_set_uri fail(%s)\n", ghttp_get_error(request));
		ghttp_request_destroy(request);
		return -1;
	}

	if(ghttp_set_type(request, ghttp_type_get) == -1) {
		log_out(log_error, "http_get::ghttp_set_type fail(%s)\n", ghttp_get_error(request));
		ghttp_request_destroy(request);
		return -1;
	}
	
	//����ͷ
	ghttp_set_header(request, http_hdr_Accept_Charset, "x-www-form-urlencoded");
	ghttp_set_header(request, http_hdr_Connection, "close");
	ghttp_set_header(request, http_hdr_Content_Type, "json");
	ghttp_set_header(request, http_hdr_Timeout, "5000");  


	if(ghttp_prepare(request) < 0){
		log_out(log_error, "http_get::ghttp_prepare fail(%s)\n", ghttp_get_error(request));
		ghttp_request_destroy(request);
		return -1;
	}
	
	ghttp_status req_status = ghttp_process(request);
	if (req_status == ghttp_error) {
		log_out(log_error, "http_get::ghttp_process url(%s) fail(%s)\n",
			url, ghttp_get_error(request));
		ghttp_request_destroy(request);
		return -1;
	}
	
	int stat_code = ghttp_status_code(request);
	if(stat_code != 200){
		log_out(log_error, "http_get::status code(%d)\n", stat_code);
		ghttp_request_destroy(request);
		return -1;
	}
	
	int	rsplen = ghttp_get_body_len(request);
	char * rspbody = ghttp_get_body(request);
	if((!rspbody) || (rsplen <= 0)){
		log_out(log_error, "http_get::ghttp_get_body fail(%s)\n", ghttp_get_error(request));
		ghttp_request_destroy(request);
		return -1;
	}
	
	if(rspbody[rsplen -1] == '\n')rsplen--;
	int ncopy = result_len < rsplen ? result_len : rsplen;
	strncpy(result, rspbody, ncopy);
	ghttp_request_destroy(request);
	
	uint take = (uint)(get_tick_count() - post_begin);
	log_out(log_debug, "http_get::take(%ums) response(%s)\n", take, result);
	
	return 0;
}
예제 #5
0
int post_http_request(char * url, char * json, int len, 
				char * result, int result_len){
	int64 post_begin = get_tick_count();
	ghttp_request * request = ghttp_request_new();
	if(!request){
		log_out(log_error, "http_post::ghttp_request_new fail\n");
		return -1;
	}

	if(ghttp_set_uri(request, (char*)url) == -1){
		log_out(log_error, "http_post::ghttp_set_uri fail(%s)\n", ghttp_get_error(request));
		ghttp_request_destroy(request);
		return -1;
	}

	if(ghttp_set_type(request, ghttp_type_post) == -1) {
		log_out(log_error, "http_post::ghttp_set_type fail(%s)\n", ghttp_get_error(request));
		ghttp_request_destroy(request);
		return -1;
	}

	//����ͷ
	ghttp_set_header(request, http_hdr_Accept_Charset, "x-www-form-urlencoded");
	ghttp_set_header(request, http_hdr_Connection, "keep-alive");
	ghttp_set_header(request, http_hdr_Content_Type, "json");
	//ghttp_set_header(request, http_hdr_Authorization, "Basic c2hlbmdhbmc6MTIzNDU2");
	ghttp_set_header(request, http_hdr_Timeout, "5000");  
	char content_len[16] = {0};
	sprintf(content_len, "%d", len);
	ghttp_set_header(request, http_hdr_Content_Length, content_len);

	if(ghttp_set_body(request, json, len) == -1){
		log_out(log_error, "http_post::ghttp_set_body fail(%s)\n", ghttp_get_error(request));
		ghttp_request_destroy(request);
		return -1;
	}

	if(ghttp_prepare(request) < 0){
		log_out(log_error, "http_post::ghttp_prepare fail(%s)\n", ghttp_get_error(request));
		ghttp_request_destroy(request);
		return -1;
	}

	ghttp_status req_status = ghttp_process(request);
	if (req_status == ghttp_error){
		log_out(log_error, "http_post::ghttp_process url(%s) fail(%s)\n",
				url, ghttp_get_error(request));
		ghttp_request_destroy(request);
		return -1;
	}

	int stat_code = ghttp_status_code(request);
	if(stat_code != 200){
		log_out(log_error, "http_post::data len(%d) status code(%d)\n", len, stat_code);
		ghttp_request_destroy(request);
		return -1;
	}

	int	rsplen = ghttp_get_body_len(request);
	char * rspbody = ghttp_get_body(request);
	if((!rspbody) || (rsplen <= 1)){
		log_out(log_error, "http_post::ghttp_get_body fail(%s)\n", ghttp_get_error(request));
		ghttp_request_destroy(request);
		return -1;
	}

	if(rspbody[rsplen - 1] == '\n'){
		rsplen--;}
	int ncopy = (result_len <= rsplen) ? result_len -1 : rsplen;
	if(result){
		strncpy(result, rspbody, ncopy);
	}

	ghttp_request_destroy(request);
	
	uint take = (uint)(get_tick_count() - post_begin);
	log_out(log_debug, "http_post::data len(%d) take(%ums) response(%s)\n", len, take, result);
	
	return 0;				
}
예제 #6
0
ghttp_request *send_request(char *uri, int urilen, int mothod, char *path, int pathlen, char *body, int bodylen, char *responsebuf, int *responselen)
{
	//char *uri = "http://www.solidot.org";
	/* This is the http request object */
	ghttp_request *request = NULL;
	ghttp_status status;
	char *buf = NULL, *allpath = NULL;
	int bytes_read = 0, ret = 0, allpathlen = urilen + pathlen;

	if(uri == NULL || urilen == 0 )
	{
		ret = -1;
		LOG_PRINTF("Error: Func: %sAcclocate new empty request is NULL\n", __func__);
		return request;
	}
	allpath = calloc(1, allpathlen + 1);
	snprintf(allpath, allpathlen+1, "%s%s", uri, path);
	LOG_PRINTF("Info: Func: %s allpath is %s allpath len is %d uri is %s. \n", __func__, allpath, pathlen, uri);
	/* Allocate a new empty request object */
	request = ghttp_request_new();
	if (request == NULL)
	{
		ret = -1;
		LOG_PRINTF("Error: Func: %s new request return error.\n", __func__);
		return request;
	}
	else
	{
		LOG_PRINTF("Info: Func: %s Acclocate new empty request is ok. \n", __func__);
	}
	/* Set the URI for the request object */
	if(ghttp_set_uri(request, allpath) == -1)
	{	
		ret = -1;
		LOG_PRINTF("Error: Func: %s set uri return error.\n", __func__);
		return request;
	}
	LOG_PRINTF("Info: Func: %s set uri  is ok. \n", __func__);
	/* Set the type for the request object */
	if(ghttp_set_type(request, (ghttp_type)mothod) == -1)
	{
		ret = -1;
		LOG_PRINTF("Error: Func: %s set type return error.\n", __func__);
		return request;
	}
	LOG_PRINTF("Info: Func: %s set type is ok. \n", __func__);
	if(body != NULL && bodylen != 0)
	{
		LOG_PRINTF("Info: Func: %s set body is %s \n", __func__, body);
		ret = ghttp_set_body(request,body, bodylen);
		if (ret == -1)
		{
			LOG_PRINTF("Error: Func: %s set body return error.\n", __func__);
			return request;
		}
		else
		{
			LOG_PRINTF("Info: Func: %s set body is ok. \n", __func__);
		}
	}
	else
	{
		LOG_PRINTF("Info: Func: %s not set body.\n", __func__);
	}
	/* Prepare the connection */
	ghttp_prepare(request);
	/* Process the request */
	status = ghttp_process(request);
	if(status == ghttp_error)
	{
		ret = -1;
		LOG_PRINTF("Error: Func: %s ghttp_process return error.\n", __func__);
		return request;
	}
	/* OK, done */
	LOG_PRINTF("Info: Func: %s Status code -> %d\n", __func__, ghttp_status_code(request));
	/* Get the response for the request */
	buf = ghttp_get_body(request);
	bytes_read = ghttp_get_body_len(request);
	if(buf != NULL && bytes_read >= 0 )
	{
		memcpy(responsebuf, buf, *responselen);
	}
	/* Get the response for the request*/
	*responselen = bytes_read;
	LOG_PRINTF("Info: Func: %s get_body len is %d response is: %s \n", __func__, bytes_read, buf);
	//printf("%s\n", buf);
	return request;
}