📄 stdsoap2.c
字号:
{ 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 + -