int Ns_ConnFlush(Ns_Conn *conn, char *buf, int len, int stream) { Conn *connPtr = (Conn *) conn; NsServer *servPtr = connPtr->servPtr; Tcl_Encoding encoding; Tcl_DString enc, gzip; char *ahdr; int status; Tcl_DStringInit(&enc); Tcl_DStringInit(&gzip); if (len < 0) { len = strlen(buf); } /* * Encode content to the expected charset. */ encoding = Ns_ConnGetEncoding(conn); if (encoding != NULL) { Tcl_UtfToExternalDString(encoding, buf, len, &enc); buf = enc.string; len = enc.length; } /* * GZIP the content when not streaming if enabled and the content * length is above the minimum. */ if (!stream && (conn->flags & NS_CONN_GZIP) && (servPtr->opts.flags & SERV_GZIP) && (len > (int) servPtr->opts.gzipmin) && (ahdr = Ns_SetIGet(conn->headers, "Accept-Encoding")) != NULL && strstr(ahdr, "gzip") != NULL && Ns_Gzip(buf, len, servPtr->opts.gziplevel, &gzip) == NS_OK) { buf = gzip.string; len = gzip.length; Ns_ConnCondSetHeaders(conn, "Content-Encoding", "gzip"); } /* * Flush content. */ status = Ns_ConnFlushDirect(conn, buf, len, stream); Tcl_DStringFree(&enc); Tcl_DStringFree(&gzip); return status; }
int Ns_CompressGzip(char *buf, int len, Tcl_DString *outPtr, int level) { return Ns_Gzip(buf, len, level, outPtr); }