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

📄 stdsoap2.c

📁 apache模组的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
  { soap->count += n;    if (soap->fprepare)      return soap->fprepare(soap, s, n);    return SOAP_OK;  }  if (soap->mode & SOAP_IO)  { register size_t i = SOAP_BUFLEN - soap->bufidx;    while (n >= i)    { memcpy(soap->buf + soap->bufidx, s, i);      soap->bufidx = SOAP_BUFLEN;      if (soap_flush(soap))        return soap->error;      s += i;      n -= i;      i = SOAP_BUFLEN;    }    memcpy(soap->buf + soap->bufidx, s, n);    soap->bufidx += n;    return SOAP_OK;  }  return soap_flush_raw(soap, s, n);}#endif/******************************************************************************/#ifndef PALM_1SOAP_FMAC1intSOAP_FMAC2soap_send(struct soap *soap, const char *s){ if (s)    return soap_send_raw(soap, s, strlen(s));  return SOAP_OK;}#endif/******************************************************************************/#ifndef MAC_CARBON#ifndef PALM_1static size_tfrecv(struct soap *soap, char *s, size_t n){ register int r;  soap->errnum = 0;#if defined(__cplusplus) && !defined(UNDER_CE)  if (soap->is)  { if (soap->is->good())      return soap->is->read(s, n).gcount();    return 0;  }#endif  if (soap_valid_socket(soap->socket))  { for (;;)    { #ifndef WITH_LEAN      struct timeval timeout;      fd_set fd;      if (soap->recv_timeout)      { if (soap->recv_timeout > 0)        { timeout.tv_sec = soap->recv_timeout;          timeout.tv_usec = 0;        }        else        { timeout.tv_sec = -soap->recv_timeout/1000000;          timeout.tv_usec = -soap->recv_timeout%1000000;        }        FD_ZERO(&fd);        FD_SET((SOAP_SOCKET)soap->socket, &fd);        for (;;)        { r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);          if (r > 0)            break;          if (!r)            return 0;          if (soap_socket_errno != SOAP_EINTR)          { soap->errnum = soap_socket_errno;            return 0;          }        }      }#endif#ifdef WITH_OPENSSL      if (soap->ssl)      { int err;	r = SSL_read(soap->ssl, s, n);        if ((err = SSL_get_error(soap->ssl, r)) == SSL_ERROR_NONE)          return (size_t)r;	if (err != SSL_ERROR_WANT_READ)          return 0;      }      else#endif      { r = recv((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags);        if (r >= 0)          return (size_t)r;        if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN)        { soap->errnum = soap_socket_errno;          return 0;        }      }#ifndef WITH_LEAN      { struct timeval timeout;        fd_set fd;        timeout.tv_sec = 0;        timeout.tv_usec = 10000;        FD_ZERO(&fd);        FD_SET((SOAP_SOCKET)soap->socket, &fd);        r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);        if (r < 0 && soap_socket_errno != SOAP_EINTR)        { soap->errnum = soap_socket_errno;          return 0;        }      }#endif    }  }#ifdef WITH_FASTCGI  return fread(s, 1, n, stdin);#else#ifdef UNDER_CE  return fread(s, 1, n, soap->recvfd);#else  r = read((SOAP_SOCKET)soap->recvfd, s, n);  if (r >= 0)    return (size_t)r;  soap->errnum = soap_errno;  return 0;#endif#endif}#endif#endif/******************************************************************************/#ifndef PALM_1static wcharsoap_getchunkchar(struct soap *soap){ if (soap->bufidx < soap->buflen)    return soap->buf[soap->bufidx++];  soap->bufidx = 0;  soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, SOAP_BUFLEN);  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)soap->buflen));  DBGMSG(RECV, soap->buf, soap->buflen);  if (soap->buflen)    return soap->buf[soap->bufidx++];  return EOF;}#endif/******************************************************************************/#ifndef PALM_1/*SOAP_FMAC1intSOAP_FMAC2soap_recv_raw(struct soap *soap){ register size_t ret;#ifdef WITH_ZLIB  if (soap->mode & SOAP_ENC_ZLIB)  { if (soap->d_stream.next_out == Z_NULL)      return EOF;    if (soap->d_stream.avail_in || !soap->d_stream.avail_out)    { register int r;      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n"));      soap->d_stream.next_out = (Byte*)soap->buf;      soap->d_stream.avail_out = SOAP_BUFLEN;      r = inflate(&soap->d_stream, Z_NO_FLUSH);      if (r == Z_OK || r == Z_STREAM_END)      { soap->bufidx = 0;        soap->buflen = SOAP_BUFLEN - soap->d_stream.avail_out;        if (soap->zlib_in == SOAP_ZLIB_GZIP)          soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);        if (r == Z_STREAM_END)        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));          soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;          soap->d_stream.next_out = Z_NULL;        }        if (soap->buflen)        { soap->count += soap->buflen;          return SOAP_OK;        }      }      else if (r != Z_BUF_ERROR)      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));        soap->d_stream.next_out = Z_NULL;        return EOF;      }    }zlib_again:    if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize)    { memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);      soap->buflen = soap->z_buflen;    }  }#endif  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) // read HTTP chunked transfer   { chunk_again:    if (soap->chunksize)    { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize);      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret));      DBGMSG(RECV, soap->buf, ret);      soap->bufidx = 0;      soap->chunksize -= ret;    }    else    { register wchar c;      char tmp[8], *t;      t = tmp;      if (!soap->chunkbuflen)      { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));        DBGMSG(RECV, soap->buf, ret);        soap->bufidx = 0;        if (!ret)          return EOF;      }      else        soap->bufidx = soap->buflen;      soap->buflen = soap->chunkbuflen;      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (%u %u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen));      while (!isxdigit((int)(c = soap_getchunkchar(soap))))        if (c == EOF)	  return EOF;      do        *t++ = (char)c;      while (isxdigit((int)(c = soap_getchunkchar(soap))) && t - tmp < 7);      while (c != EOF && c != '\n')        c = soap_getchunkchar(soap);      if (c == EOF)        return EOF;      *t = '\0';      soap->chunksize = strtoul(tmp, &t, 16);      if (!soap->chunksize)      { soap->chunkbuflen = 0;        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n"));	while (c != EOF && c != '\n')          c = soap_getchunkchar(soap);        return EOF;      }      soap->buflen = soap->bufidx + soap->chunksize;      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to %u (%u %s)\n", (unsigned int)soap->buflen, (unsigned int)soap->bufidx, tmp));      if (soap->buflen > soap->chunkbuflen)      { soap->buflen = soap->chunkbuflen;        soap->chunksize -= soap->buflen - soap->bufidx;        soap->chunkbuflen = 0;        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%lu bytes left)\n", (unsigned long)(soap->buflen - soap->bufidx)));      }      else if (soap->chunkbuflen)        soap->chunksize = 0;      ret = soap->buflen - soap->bufidx;      if (!ret)        goto chunk_again;    }  }  else  { soap->bufidx = 0;    soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));    DBGMSG(RECV, soap->buf, ret);  }#ifdef WITH_ZLIB  if (soap->mode & SOAP_ENC_ZLIB)  { int r;    memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);    soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);    soap->d_stream.avail_in = (unsigned int)ret;    soap->d_stream.next_out = (Byte*)soap->buf;    soap->d_stream.avail_out = SOAP_BUFLEN;    r = inflate(&soap->d_stream, Z_NO_FLUSH);    if (r == Z_OK || r == Z_STREAM_END)    { soap->bufidx = 0;      soap->z_buflen = soap->buflen;      soap->buflen = ret = SOAP_BUFLEN - soap->d_stream.avail_out;      if (soap->zlib_in == SOAP_ZLIB_GZIP)        soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)ret));      if (!ret)        goto zlib_again;      if (r == Z_STREAM_END)      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));        soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;        soap->d_stream.next_out = Z_NULL;      }    }    else    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream.msg?soap->d_stream.msg:""));      soap->d_stream.next_out = Z_NULL;      return EOF;    }  }#endif  soap->count += ret;  return !ret;}*/int soap_recv_raw(struct soap *soap){ 	register size_t ret;	/* read HTTP chunked transfer */	if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) 	{ chunk_again:		if (soap->chunksize) {			soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize);			DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret));			DBGMSG(RECV, soap->buf, ret);			soap->bufidx = 0;			soap->chunksize -= ret;		} else {			register wchar c;			char tmp[8], *t;			t = tmp;			if (!soap->chunkbuflen)			{ 				soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);				DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));				DBGMSG(RECV, soap->buf, ret);				soap->bufidx = 0;				if (!ret)	  				return EOF;			} else 				soap->bufidx = soap->buflen;			soap->buflen = soap->chunkbuflen;			DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (%u %u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen));			while (!isxdigit((int)(c = soap_getchunkchar(soap))))				if (c == EOF)					return EOF;			do				*t++ = (char)c;			while (isxdigit((int)(c = soap_getchunkchar(soap))) && t - tmp < 7);			while (c != EOF && c != '\n')				c = soap_getchunkchar(soap);			if (c == EOF) return EOF;				*t = '\0';			soap->chunksize = strtoul(tmp, &t, 16);			if (!soap->chunksize)			{				soap->chunkbuflen = 0;				DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n"));				while (c != EOF && c != '\n')					c = soap_getchunkchar(soap);				return EOF;			}			soap->buflen = soap->bufidx + soap->chunksize;			DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to %u (%u %s)\n", (unsigned int)soap->buflen, (unsigned int)soap->bufidx, tmp));			if (soap->buflen > soap->chunkbuflen) {				soap->buflen = soap->chunkbuflen;				soap->chunksize -= soap->buflen - soap->bufidx;				soap->chunkbuflen = 0;				DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%lu bytes left)\n", (unsigned long)(soap->buflen - soap->bufidx)));			} else if (soap->chunkbuflen)				soap->chunksize = 0;			ret = soap->buflen - soap->bufidx;			if (!ret)				goto chunk_again;		}	}else	{		soap->bufidx = 0;		soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);		DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));		DBGMSG(RECV, soap->buf, ret);	}	soap->count += ret;	return !ret;}#endif/******************************************************************************/#ifndef PALM_1SOAP_FMAC1intSOAP_FMAC2soap_recv(struct soap *soap){ #ifndef WITH_LEANER	if (soap->mode & SOAP_ENC_DIME) {		if (soap->dime_buflen){ 			char *s;	  		int i;	  		unsigned char tmp[12];			DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n"));			soap->count += soap->dime_buflen - soap->buflen;			soap->buflen = soap->dime_buflen;			DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime_size&3));			for (i = -(long)soap->dime_size&3; i > 0; i--) { 				soap->bufidx++;			    if (soap->bufidx >= soap->buflen)	    			if (soap_recv_raw(soap))	        	return EOF;	  		}			DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n"));			s = (char*)tmp;			for (i = 12; i > 0; i--) {				*s++ = soap->buf[soap->bufidx++];			    if (soap->bufidx >= soap->buflen)	    			if (soap_recv_raw(soap))				return EOF;	  		}	  		soap->dime_flags = tmp[0] & 0x7;	  		soap->dime_size = (size_t)tmp[8] << 24 | (size_t)tmp[9] << 16 | (size_t)tmp[10] << 8 | (size_t)tmp[11];			DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime_size));			if (soap->dime_flags & SOAP_DIME_CF) {				DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n"));	    		soap->dime_chunksize = soap->dime_size;	    		if (soap->buflen - soap->bufidx >= soap->dime_size){ 					soap->dime_buflen = soap->buflen;					soap->buflen = soap->bufidx + soap->dime_chunksize;	    		} else					soap->dime_chunksize -= soap->buflen - soap->bufidx;	  		} else {	  			DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n"));			    soap->dime_buflen = 0;	    		soap->dime_chunksize = 0;	  		}	  		soap->count = soap->buflen - soap->bufidx;	  		DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count));	  		return SOAP_OK;		}		if (soap->dime_chunksize) {			DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime_chunksize));	  		if (soap_recv_raw(soap)) return EOF;			if (soap->buflen - soap->bufidx >= soap->dime_chunksize) {				soap->dime_buflen = soap->buflen;				soap->count -= soap->buflen - soap->bufidx - soap->dime_chunksize;				soap->buflen = soap->bufidx + soap->dime_chunksize;	  		} else	  			soap->dime_chunksize -= soap->buflen - soap->bufidx;			DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%u\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned int)soap->count));	  		return SOAP_OK;		}	}#endif	return soap_recv_raw(soap);}#endif/******************************************************************************/#ifndef PALM_1SOAP_FMAC1wcharSOAP_FMAC2soap_getchar(struct soap *soap){ register wchar c;  if (soap->ahead)  { c = soap->ahead;    soap->ahead = 0;    return c;  }  return soap_get1(soap);}#endif/******************************************************************************/#ifndef PALM_1static wcharsoap_char(struct soap *soap){ char tmp[8];  register int i;  register wchar c;  register char *s = tmp;#ifndef WITH_LEAN  register const struct code_map *map;#endif  for (i = 0; i < 7; i++)

⌨️ 快捷键说明

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