"Fossies" - the Fresh Open Source Software Archive

Member "selenium-selenium-4.8.1/third_party/cpp/civetweb/mod_zlib.inl" (17 Feb 2023, 3021 Bytes) of package /linux/www/selenium-selenium-4.8.1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /* Experimental implementation for on-the-fly compression */
    2 #if !defined(USE_ZLIB)
    3 #error "This file must only be included, if USE_ZLIB is set"
    4 #endif
    5 
    6 #include "zconf.h"
    7 #include "zlib.h"
    8 
    9 #if !defined(MEM_LEVEL)
   10 #define MEM_LEVEL (8)
   11 #endif
   12 
   13 static void *
   14 zalloc(void *opaque, uInt items, uInt size)
   15 {
   16     struct mg_connection *conn = (struct mg_connection *)opaque;
   17     void *ret = mg_calloc_ctx(items, size, conn->phys_ctx);
   18 
   19     return ret;
   20 }
   21 
   22 
   23 static void
   24 zfree(void *opaque, void *address)
   25 {
   26     struct mg_connection *conn = (struct mg_connection *)opaque;
   27     (void)conn; /* not required */
   28 
   29     mg_free(address);
   30 }
   31 
   32 
   33 static void
   34 send_compressed_data(struct mg_connection *conn, struct mg_file *filep)
   35 {
   36 
   37     int zret;
   38     z_stream zstream;
   39     int do_flush;
   40     unsigned bytes_avail;
   41     unsigned char in_buf[MG_BUF_LEN];
   42     unsigned char out_buf[MG_BUF_LEN];
   43     FILE *in_file = filep->access.fp;
   44 
   45     /* Prepare state buffer. User server context memory allocation. */
   46     memset(&zstream, 0, sizeof(zstream));
   47     zstream.zalloc = zalloc;
   48     zstream.zfree = zfree;
   49     zstream.opaque = (void *)conn;
   50 
   51     /* Initialize for GZIP compression (MAX_WBITS | 16) */
   52     zret = deflateInit2(&zstream,
   53                         Z_BEST_COMPRESSION,
   54                         Z_DEFLATED,
   55                         MAX_WBITS | 16,
   56                         MEM_LEVEL,
   57                         Z_DEFAULT_STRATEGY);
   58 
   59     if (zret != Z_OK) {
   60         mg_cry_internal(conn,
   61                         "GZIP init failed (%i): %s",
   62                         zret,
   63                         (zstream.msg ? zstream.msg : "<no error message>"));
   64         deflateEnd(&zstream);
   65         return;
   66     }
   67 
   68     /* Read until end of file */
   69     do {
   70         zstream.avail_in = fread(in_buf, 1, MG_BUF_LEN, in_file);
   71         if (ferror(in_file)) {
   72             mg_cry_internal(conn, "fread failed: %s", strerror(ERRNO));
   73             (void)deflateEnd(&zstream);
   74             return;
   75         }
   76 
   77         do_flush = (feof(in_file) ? Z_FINISH : Z_NO_FLUSH);
   78         zstream.next_in = in_buf;
   79 
   80         /* run deflate() on input until output buffer not full, finish
   81          * compression if all of source has been read in */
   82         do {
   83             zstream.avail_out = MG_BUF_LEN;
   84             zstream.next_out = out_buf;
   85             zret = deflate(&zstream, do_flush);
   86 
   87             if (zret == Z_STREAM_ERROR) {
   88                 /* deflate error */
   89                 zret = -97;
   90                 break;
   91             }
   92 
   93             bytes_avail = MG_BUF_LEN - zstream.avail_out;
   94             if (bytes_avail) {
   95                 if (mg_send_chunk(conn, (char *)out_buf, bytes_avail) < 0) {
   96                     zret = -98;
   97                     break;
   98                 }
   99             }
  100 
  101         } while (zstream.avail_out == 0);
  102 
  103         if (zret < -90) {
  104             /* Forward write error */
  105             break;
  106         }
  107 
  108         if (zstream.avail_in != 0) {
  109             /* all input will be used, otherwise GZIP is incomplete */
  110             zret = -99;
  111             break;
  112         }
  113 
  114         /* done when last data in file processed */
  115     } while (do_flush != Z_FINISH);
  116 
  117     if (zret != Z_STREAM_END) {
  118         /* Error: We did not compress everything. */
  119         mg_cry_internal(conn,
  120                         "GZIP incomplete (%i): %s",
  121                         zret,
  122                         (zstream.msg ? zstream.msg : "<no error message>"));
  123     }
  124 
  125     deflateEnd(&zstream);
  126 
  127     /* Send "end of chunked data" marker */
  128     mg_write(conn, "0\r\n\r\n", 5);
  129 }