- len = len + rlen;
- }
-
-#ifdef HTTP_TRACING
- write(2, "\033[32m", 5);
- write(2, buf, bytes);
- write(2, "\033[30m", 5);
-#endif
- return (1);
-}
-
-/*
- * \brief Begin buffering HTTP output so we can transmit it all in one write operation later.
- */
-void begin_burst(void)
-{
- if (WC->WBuf == NULL)
- WC->WBuf = NewStrBufPlain(NULL, 32768);
-}
-
-
-/*
- * \brief Finish buffering HTTP output. [Compress using zlib and] output with a Content-Length: header.
- */
-long end_burst(void)
-{
- struct wcsession *WCC = WC;
- const char *ptr, *eptr;
- long count;
- ssize_t res;
- fd_set wset;
- int fdflags;
-
-#ifdef HAVE_ZLIB
- /* Perform gzip compression, if enabled and supported by client */
- if ((WCC->gzip_ok) && CompressBuffer(WCC->WBuf))
- {
- hprintf("Content-encoding: gzip\r\n");
- }
-#endif /* HAVE_ZLIB */
-
- hprintf("Content-length: %d\r\n\r\n", StrLength(WCC->WBuf));
-
- ptr = ChrPtr(WCC->HBuf);
- count = StrLength(WCC->HBuf);
- eptr = ptr + count;
-
-#ifdef HAVE_OPENSSL
- if (is_https) {
- client_write_ssl(WCC->HBuf);
- client_write_ssl(WCC->WBuf);
- return (count);
- }
-#endif
-
-
-#ifdef HTTP_TRACING
-
- write(2, "\033[34m", 5);
- write(2, ptr, StrLength(WCC->WBuf));
- write(2, "\033[30m", 5);
-#endif
- fdflags = fcntl(WC->http_sock, F_GETFL);
-
- while (ptr < eptr) {
- if ((fdflags & O_NONBLOCK) == O_NONBLOCK) {
- FD_ZERO(&wset);
- FD_SET(WCC->http_sock, &wset);
- if (select(WCC->http_sock + 1, NULL, &wset, NULL, NULL) == -1) {
- lprintf(2, "client_write: Socket select failed (%s)\n", strerror(errno));
- return -1;
- }
- }
-
- if ((res = write(WCC->http_sock,
- ptr,
- count)) == -1) {
- lprintf(2, "client_write: Socket write failed (%s)\n", strerror(errno));
- return res;
- }
- count -= res;
- ptr += res;
- }
-
- ptr = ChrPtr(WCC->WBuf);
- count = StrLength(WCC->WBuf);
- eptr = ptr + count;
-
-#ifdef HTTP_TRACING
-
- write(2, "\033[34m", 5);
- write(2, ptr, StrLength(WCC->WBuf));
- write(2, "\033[30m", 5);
-#endif
-
- while (ptr < eptr) {
- if ((fdflags & O_NONBLOCK) == O_NONBLOCK) {
- FD_ZERO(&wset);
- FD_SET(WCC->http_sock, &wset);
- if (select(WCC->http_sock + 1, NULL, &wset, NULL, NULL) == -1) {
- lprintf(2, "client_write: Socket select failed (%s)\n", strerror(errno));
- return -1;
- }
- }
-
- if ((res = write(WCC->http_sock,
- ptr,
- count)) == -1) {
- lprintf(2, "client_write: Socket write failed (%s)\n", strerror(errno));
- return res;
- }
- count -= res;
- ptr += res;
- }
-
- return StrLength(WCC->WBuf);
-}
-
-
-
-/*
- * \brief Read data from the client socket with default timeout.
- * (This is implemented in terms of client_read_to() and could be
- * justifiably moved out of sysdep.c)
- * \param sock the socket fd to read from
- * \param buf the buffer to write to
- * \param bytes Number of bytes to read
- */
-int client_read(int sock, char *buf, int bytes)
-{
- return (client_read_to(sock, buf, bytes, SLEEPING));
-}
-
-
-/*
- * \brief Get a LF-terminated line of text from the client.
- * (This is implemented in terms of client_read() and could be
- * justifiably moved out of sysdep.c)
- * \param sock socket fd to get client line from
- * \param buf buffer to write read data to
- * \param bufsiz how many bytes to read
- * \return number of bytes read???
- */
-int client_getln(int sock, char *buf, int bufsiz)
-{
- int i, retval;
-
- /* Read one character at a time.*/
- for (i = 0;; i++) {
- retval = client_read(sock, &buf[i], 1);
- if (retval != 1 || buf[i] == '\n' || i == (bufsiz-1))
- break;
- if ( (!isspace(buf[i])) && (!isprint(buf[i])) ) {
- /* Non printable character recieved from client */
- return(-1);