⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 http_req.c

📁 完整实现http协议源代码(WINDOWS或LINUX平台均可移植使用),我在VC++上(不调用WINDOWS的HTTP的API)可实现XML文件下载等.
💻 C
字号:
/* * http_req.c -- Functions for making http requests * Created: Christopher Blizzard <blizzard@appliedtheory.com>, 6-Aug-1998 * * Copyright (C) 1998 Free Software Foundation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <string.h>#include <stdlib.h>#include "http_req.h"#include "http_trans.h"#include "http_global.h"const char *http_req_type_char[] = {  "GET",  "OPTIONS",  "HEAD",  "POST",  "PUT",  "DELETE",  "TRACE",  "CONNECT",  "PROPFIND",  "PROPPATCH",  "MKCOL",  "COPY",  "MOVE",  "LOCK",  "UNLOCK",  NULL};http_req *http_req_new(void){  http_req *l_return = NULL;    l_return = (http_req *)malloc(sizeof(http_req));  memset(l_return, 0, sizeof(http_req));  /* default to 1.1 */  l_return->http_ver = 1.1;  l_return->headers = http_hdr_list_new();  return l_return;}voidhttp_req_destroy(http_req *a_req){  if (!a_req)    return;  if (a_req->headers)    http_hdr_list_destroy(a_req->headers);  free(a_req);}inthttp_req_prepare(http_req *a_req){  int l_return = 0;  char l_buf[30];  if (!a_req)    return -1;  memset(l_buf, 0, 30);  /* set the host header */  http_hdr_set_value(a_req->headers,		     http_hdr_Host,		     a_req->host);  /* check to see if we have an entity body */  if ((a_req->type == http_req_type_post) ||      (a_req->type == http_req_type_put) ||      (a_req->type == http_req_type_trace))    {      sprintf(l_buf, "%d", a_req->body_len);      http_hdr_set_value(a_req->headers,			 http_hdr_Content_Length,			 l_buf);    }  /* if the user agent isn't set then set a default */  if (http_hdr_get_value(a_req->headers, http_hdr_User_Agent) == NULL)    http_hdr_set_value(a_req->headers, http_hdr_User_Agent,		       "libghttp/1.0");  return l_return;}inthttp_req_send(http_req *a_req, http_trans_conn *a_conn){  char       *l_request = NULL;  int         l_request_len = 0;  int         i = 0;  int         l_len = 0;  int         l_headers_len = 0;  int         l_rv = 0;  char       *l_content = NULL;  /* see if we need to jump into the function somewhere */  if (a_conn->sync == HTTP_TRANS_ASYNC)    {      if (a_req->state == http_req_state_sending_request)	goto http_req_state_sending_request_jump;      if (a_req->state == http_req_state_sending_headers)	goto http_req_state_sending_headers_jump;      if (a_req->state == http_req_state_sending_body)	goto http_req_state_sending_body_jump;    }  /* enough for the request and the other little headers */  l_request = malloc(30 + strlen(a_req->resource) + (a_conn->proxy_host ?						     (strlen(a_req->host) + 20) : 0));  memset(l_request, 0, 30 + strlen(a_req->resource) + (a_conn->proxy_host ?						       (strlen(a_req->host) + 20) : 0));  /* copy it into the buffer */  if (a_conn->proxy_host)    {      l_request_len = sprintf(l_request,			      "%s %s HTTP/%01.1f\r\n",			      http_req_type_char[a_req->type],			      a_req->full_uri,			      a_req->http_ver);    }  else    {      l_request_len = sprintf(l_request,			      "%s %s HTTP/%01.1f\r\n",			      http_req_type_char[a_req->type],			      a_req->resource,			      a_req->http_ver);    }  /* set the request in the connection buffer */  http_trans_append_data_to_buf(a_conn, l_request, l_request_len);  /* free up the request - we don't need it anymore */  free(l_request);  l_request = NULL;  /* set the state */  a_req->state = http_req_state_sending_request; http_req_state_sending_request_jump:  /* send the request */  do {    l_rv = http_trans_write_buf(a_conn);    if ((a_conn->sync == HTTP_TRANS_ASYNC) && (l_rv == HTTP_TRANS_NOT_DONE))      return HTTP_TRANS_NOT_DONE;    if ((l_rv == HTTP_TRANS_DONE) && (a_conn->last_read == 0))      return HTTP_TRANS_ERR;  } while (l_rv == HTTP_TRANS_NOT_DONE);  /* reset the buffer */  http_trans_buf_reset(a_conn);  /* set up all of the headers */  for (i = 0; i < HTTP_HDRS_MAX; i++)    {      l_len = 0;      if (a_req->headers->header[i])	{	  l_len = strlen(a_req->headers->header[i]);	  if (l_len > 0)	    {	      http_trans_append_data_to_buf(a_conn, a_req->headers->header[i], l_len);	      l_headers_len += l_len;	      http_trans_append_data_to_buf(a_conn, ": ", 2);	      l_headers_len += 2;	      /* note, it's ok to have no value for a request */	      if ((l_len = strlen(a_req->headers->value[i])) > 0)		{		  http_trans_append_data_to_buf(a_conn, a_req->headers->value[i], l_len);		  l_headers_len += l_len;		}	      http_trans_append_data_to_buf(a_conn, "\r\n", 2);	      l_headers_len += 2;	    }	}    }  http_trans_append_data_to_buf(a_conn, "\r\n", 2);  l_headers_len += 2;  /* set the state */  a_req->state = http_req_state_sending_headers; http_req_state_sending_headers_jump:  /* blast that out to the network */  do {    l_rv = http_trans_write_buf(a_conn);    if ((a_conn->sync == HTTP_TRANS_ASYNC) && (l_rv == HTTP_TRANS_NOT_DONE))      return HTTP_TRANS_NOT_DONE;    if ((l_rv == HTTP_TRANS_DONE) && (a_conn->last_read == 0))      return HTTP_TRANS_ERR;  } while (l_rv == HTTP_TRANS_NOT_DONE);  /* reset the buffer */  http_trans_buf_reset(a_conn);  l_content = http_hdr_get_value(a_req->headers, http_hdr_Content_Length);  if (l_content)    {      /* append the information to the buffer */      http_trans_append_data_to_buf(a_conn, a_req->body, a_req->body_len);      a_req->state = http_req_state_sending_body;    http_req_state_sending_body_jump:      do {	l_rv = http_trans_write_buf(a_conn);	if ((a_conn->sync == HTTP_TRANS_ASYNC) && (l_rv == HTTP_TRANS_NOT_DONE))	  return HTTP_TRANS_NOT_DONE;	if ((l_rv == HTTP_TRANS_DONE) && (a_conn->last_read == 0))	  return HTTP_TRANS_ERR;      } while (l_rv == HTTP_TRANS_NOT_DONE);      /* reset the buffer */      http_trans_buf_reset(a_conn);    }  return HTTP_TRANS_DONE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -