SSPCPP-616 - clean up concatenated string literals
[shibboleth/cpp-opensaml.git] / saml / saml2 / binding / impl / SAML2Redirect.cpp
index b90a89b..7c2a4a5 100644 (file)
@@ -1,33 +1,37 @@
-/*
- *  Copyright 2001-2006 Internet2
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+/**
+ * Licensed to the University Corporation for Advanced Internet
+ * Development, Inc. (UCAID) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ * UCAID licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the
+ * License at
  *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific
+ * language governing permissions and limitations under the License.
  */
 
 /**
  * @file saml/saml2/binding/SAML2Redirect.h
  * 
- * SAML 2.0 HTTP Redirect compression functionality
+ * SAML 2.0 HTTP Redirect compression functionality.
  */
 
 #include "internal.h"
 #include "saml2/binding/SAML2Redirect.h"
-#include "zlib/zlib.h"
 
-#include <log4cpp/Category.hh>
+#include <zlib.h>
+#include <xmltooling/logging.h>
 #include <xmltooling/util/NDC.h>
 
-using namespace log4cpp;
+using namespace xmltooling::logging;
 using namespace std;
 
 namespace {
@@ -44,19 +48,59 @@ namespace {
     };
 };
 
+char* opensaml::saml2p::deflate(char* in, unsigned int in_len, unsigned int* out_len)
+{
+#ifdef _DEBUG
+    xmltooling::NDC ndc("deflate");
+#endif
+    Category& log = Category::getInstance(SAML_LOGCAT ".MessageDecoder.SAML2Redirect.zlib");
+
+    z_stream z;
+    memset(&z, 0, sizeof(z_stream));
+    
+    z.zalloc = saml_zalloc;
+    z.zfree = saml_zfree;
+    z.opaque = nullptr;
+    z.next_in = (Bytef*)in;
+    z.avail_in = in_len;
+    *out_len = 0;
+
+    int ret = deflateInit2(&z, 9, Z_DEFLATED, -15, 9, Z_DEFAULT_STRATEGY);
+    if (ret != Z_OK) {
+        log.error("zlib deflateInit2 failed with error code (%d)", ret);
+        return nullptr;
+    }
+  
+    int dlen = in_len + (in_len >> 8) + 12;  /* orig_size * 1.001 + 12 */
+    char* out = new char[dlen];
+    z.next_out = (Bytef*)out;
+    z.avail_out = dlen;
+  
+    ret = deflate(&z, Z_FINISH);
+    if (ret != Z_STREAM_END) {
+    deflateEnd(&z);
+        log.error("zlib deflateInit2 failed with error code (%d)", ret);
+        delete[] out;
+    }
+  
+    *out_len = z.total_out;
+    deflateEnd(&z);
+    return out;
+}
+
 unsigned int opensaml::saml2p::inflate(char* in, unsigned int in_len, ostream& out)
 {
 #ifdef _DEBUG
     xmltooling::NDC ndc("inflate");
 #endif
-    Category& log = Category::getInstance(SAML_LOGCAT".MessageDecoder.SAML2Redirect.zlib");
+    Category& log = Category::getInstance(SAML_LOGCAT ".MessageDecoder.SAML2Redirect.zlib");
 
     z_stream z;
     memset(&z, 0, sizeof(z_stream));
     
     z.zalloc = saml_zalloc;
     z.zfree = saml_zfree;
-    z.opaque = NULL;
+    z.opaque = nullptr;
     z.next_in = (Bytef*)in;
     z.avail_in = in_len;
   
@@ -68,22 +112,27 @@ unsigned int opensaml::saml2p::inflate(char* in, unsigned int in_len, ostream& o
   
     int ret = inflateInit2(&z, -15);
     if (ret != Z_OK) {
-        log.error("zlib inflateInit failed with error code (%d)", ret);
+        log.error("zlib inflateInit2 failed with error code (%d)", ret);
         delete[] buf;
         return 0;
     }
   
+    size_t diff;
     int iter = 30;
     while (--iter) {  /* Make sure we can never be caught in infinite loop */
         ret = inflate(&z, Z_SYNC_FLUSH);
         switch (ret) {
             case Z_STREAM_END:
+                diff = z.next_out - buf;
+                z.next_out = buf;
+                while (diff--)
+                    out << *(z.next_out++);
                 goto done;
                 
             case Z_OK:  /* avail_out should be 0 now. Time to dump the buffer. */
-                ret = z.next_out - buf;
+                diff = z.next_out - buf;
                 z.next_out = buf;
-                while (ret--)
+                while (diff--)
                     out << *(z.next_out++);
                 memset(buf, 0, dlen);
                 z.next_out = buf;