You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2012/01/06 06:07:01 UTC

svn commit: r1227956 - in /trafficserver/traffic/trunk: lib/ts/ink_base64.cc lib/ts/ink_base64.h proxy/InkAPI.cc proxy/InkAPITest.cc proxy/api/ts/ts.h.in proxy/logging/LogUtils.cc

Author: zwoop
Date: Fri Jan  6 05:07:01 2012
New Revision: 1227956

URL: http://svn.apache.org/viewvc?rev=1227956&view=rev
Log:
Make some APIs more uniform, and fix some bugs from previous changes

Modified:
    trafficserver/traffic/trunk/lib/ts/ink_base64.cc
    trafficserver/traffic/trunk/lib/ts/ink_base64.h
    trafficserver/traffic/trunk/proxy/InkAPI.cc
    trafficserver/traffic/trunk/proxy/InkAPITest.cc
    trafficserver/traffic/trunk/proxy/api/ts/ts.h.in
    trafficserver/traffic/trunk/proxy/logging/LogUtils.cc

Modified: trafficserver/traffic/trunk/lib/ts/ink_base64.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/lib/ts/ink_base64.cc?rev=1227956&r1=1227955&r2=1227956&view=diff
==============================================================================
--- trafficserver/traffic/trunk/lib/ts/ink_base64.cc (original)
+++ trafficserver/traffic/trunk/lib/ts/ink_base64.cc Fri Jan  6 05:07:01 2012
@@ -38,20 +38,17 @@
 #include "ink_resource.h"
 #include "ink_unused.h"
 
+// TODO: The code here seems a bit klunky, and could probably be improved a bit.
 
-// TODO: This code is not paritcularly "uniform", we ought to make them
-// more the same coding style (the uuencode one seems good'ish).
-
-
-size_t
-ats_base64_encode(const unsigned char *inBuffer, size_t inBufferSize, char *outBuffer, size_t outBufSize)
+bool
+ats_base64_encode(const unsigned char *inBuffer, size_t inBufferSize, char *outBuffer, size_t outBufSize, size_t *length)
 {
   static const char _codes[66] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
   char *obuf = outBuffer;
   char in_tail[4];
 
   if (outBufSize < ATS_BASE64_ENCODE_DSTLEN(inBufferSize))
-    return 0;
+    return false;
 
   while (inBufferSize > 2) {
     *obuf++ = _codes[(inBuffer[0] >> 2) & 077];
@@ -73,7 +70,8 @@ ats_base64_encode(const unsigned char *i
    */
   if (inBufferSize == 0) {
     *obuf = '\0';
-    return (obuf - outBuffer);
+    if (length)
+      *length = (obuf - outBuffer);
   } else {
     memset(in_tail, 0, sizeof(in_tail));
     memcpy(in_tail, inBuffer, inBufferSize);
@@ -88,14 +86,17 @@ ats_base64_encode(const unsigned char *i
     *(obuf + 3) = '=';
     *(obuf + 4) = '\0';
 
-    return ((obuf + 4) - outBuffer);
+    if (length)
+      *length = (obuf + 4) - outBuffer;
   }
+
+  return true;
 }
 
-size_t
-ats_base64_encode(const char *inBuffer, size_t inBufferSize, char *outBuffer, size_t outBufSize)
+bool
+ats_base64_encode(const char *inBuffer, size_t inBufferSize, char *outBuffer, size_t outBufSize, size_t *length)
 {
-  return ats_base64_encode((const unsigned char *)inBuffer, inBufferSize, outBuffer, outBufSize);
+  return ats_base64_encode((const unsigned char *)inBuffer, inBufferSize, outBuffer, outBufSize, length);
 }
 
 
@@ -124,23 +125,29 @@ const unsigned char printableToSixBit[25
   64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
 };
 
-size_t
-ats_base64_decode(const char *inBuffer, size_t inBufferSize, unsigned char *outBuffer, size_t outBufSize)
+bool
+ats_base64_decode(const char *inBuffer, size_t inBufferSize, unsigned char *outBuffer, size_t outBufSize, size_t *length)
 {
+  size_t inBytes = 0;
   size_t decodedBytes = 0;
-  unsigned char *outStart = outBuffer;
+  unsigned char *buf = outBuffer;
   int inputBytesDecoded = 0;
 
   // Make sure there is sufficient space in the output buffer
   if (outBufSize < ATS_BASE64_DECODE_DSTLEN(inBufferSize))
-    return 0;
+    return false;
 
-  for (size_t i = 0; i < inBufferSize; i += 4) {
-    outBuffer[0] = (unsigned char) (DECODE(inBuffer[0]) << 2 | DECODE(inBuffer[1]) >> 4);
-    outBuffer[1] = (unsigned char) (DECODE(inBuffer[1]) << 4 | DECODE(inBuffer[2]) >> 2);
-    outBuffer[2] = (unsigned char) (DECODE(inBuffer[2]) << 6 | DECODE(inBuffer[3]));
+  // Ignore any trailing ='s or other undecodable characters.
+  // TODO: Perhaps that ought to be an error instead?
+  while (printableToSixBit[(uint8_t)inBuffer[inBytes]] <= MAX_PRINT_VAL)
+    ++inBytes;
+
+  for (size_t i = 0; i < inBytes; i += 4) {
+    buf[0] = (unsigned char) (DECODE(inBuffer[0]) << 2 | DECODE(inBuffer[1]) >> 4);
+    buf[1] = (unsigned char) (DECODE(inBuffer[1]) << 4 | DECODE(inBuffer[2]) >> 2);
+    buf[2] = (unsigned char) (DECODE(inBuffer[2]) << 6 | DECODE(inBuffer[3]));
 
-    outBuffer += 3;
+    buf += 3;
     inBuffer += 4;
     decodedBytes += 3;
     inputBytesDecoded += 4;
@@ -148,14 +155,17 @@ ats_base64_decode(const char *inBuffer, 
 
   // Check to see if we decoded a multiple of 4 four
   //    bytes
-  if ((inBufferSize - inputBytesDecoded) & 0x3) {
+  if ((inBytes - inputBytesDecoded) & 0x3) {
     if (DECODE(inBuffer[-2]) > MAX_PRINT_VAL) {
       decodedBytes -= 2;
     } else {
       decodedBytes -= 1;
     }
   }
-  outStart[decodedBytes] = '\0';
+  outBuffer[decodedBytes] = '\0';
+
+  if (length)
+    *length = decodedBytes;
 
-  return decodedBytes;
+  return true;
 }

Modified: trafficserver/traffic/trunk/lib/ts/ink_base64.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/lib/ts/ink_base64.h?rev=1227956&r1=1227955&r2=1227956&view=diff
==============================================================================
--- trafficserver/traffic/trunk/lib/ts/ink_base64.h (original)
+++ trafficserver/traffic/trunk/lib/ts/ink_base64.h Fri Jan  6 05:07:01 2012
@@ -37,10 +37,10 @@
  *
  */
 // Encodes / Decodes into user supplied buffer.  Returns number of bytes decoded
-size_t ats_base64_encode(const char *inBuffer, size_t inBufferSize, char *outBuffer, size_t outBufSize);
-size_t ats_base64_encode(const unsigned char *inBuffer, size_t inBufferSize, char *outBuffer, size_t outBufSize);
+bool ats_base64_encode(const char *inBuffer, size_t inBufferSize, char *outBuffer, size_t outBufSize, size_t *length);
+bool ats_base64_encode(const unsigned char *inBuffer, size_t inBufferSize, char *outBuffer, size_t outBufSize, size_t *length);
 
-size_t ats_base64_decode(const char *inBuffer, size_t inBufferSize, unsigned char *outBuffer, size_t outBufSize);
+bool ats_base64_decode(const char *inBuffer, size_t inBufferSize, unsigned char *outBuffer, size_t outBufSize, size_t *length);
 
 // Little helper functions to calculate minimum required output buffer for encoding/decoding.
 #define ATS_BASE64_ENCODE_DSTLEN(_length) ((_length * 8) / 6 + 4)

Modified: trafficserver/traffic/trunk/proxy/InkAPI.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/InkAPI.cc?rev=1227956&r1=1227955&r2=1227956&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/InkAPI.cc (original)
+++ trafficserver/traffic/trunk/proxy/InkAPI.cc Fri Jan  6 05:07:01 2012
@@ -1684,22 +1684,22 @@ _TSfree(void *ptr)
 // Encoding utility
 //
 ////////////////////////////////////////////////////////////////////
-size_t
-TSBase64Decode(const char *input, size_t length, unsigned char *dst, size_t dst_size)
+TSReturnCode
+TSBase64Decode(const char *str, size_t str_len, unsigned char *dst, size_t dst_size, size_t *length)
 {
-  sdk_assert(sdk_sanity_check_null_ptr((void*)input) == TS_SUCCESS);
+  sdk_assert(sdk_sanity_check_null_ptr((void*)str) == TS_SUCCESS);
   sdk_assert(sdk_sanity_check_null_ptr((void*)dst) == TS_SUCCESS);
 
-  return ats_base64_decode(input, length, dst, dst_size);
+  return ats_base64_decode(str, str_len, dst, dst_size, length) ? TS_SUCCESS : TS_ERROR;
 }
 
-size_t
-TSBase64Encode(const char *input, size_t length, char *dst, size_t dst_size)
+TSReturnCode
+TSBase64Encode(const char *str, size_t str_len, char *dst, size_t dst_size, size_t *length)
 {
-  sdk_assert(sdk_sanity_check_null_ptr((void*)input) == TS_SUCCESS);
+  sdk_assert(sdk_sanity_check_null_ptr((void*)str) == TS_SUCCESS);
   sdk_assert(sdk_sanity_check_null_ptr((void*)dst) == TS_SUCCESS);
 
-  return ats_base64_encode(input, length, dst, dst_size);
+  return ats_base64_encode(str, str_len, dst, dst_size, length) ? TS_SUCCESS : TS_ERROR;
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -2307,7 +2307,6 @@ TSStringPercentEncode(const char* str, i
 {
   sdk_assert(sdk_sanity_check_null_ptr((void*)str) == TS_SUCCESS);
   sdk_assert(sdk_sanity_check_null_ptr((void*)dst) == TS_SUCCESS);
-  sdk_assert(sdk_sanity_check_null_ptr((void*)length) == TS_SUCCESS);
 
   int new_len; // Unfortunately, a lot of the core uses "int" for length's internally...
 
@@ -2318,42 +2317,45 @@ TSStringPercentEncode(const char* str, i
 
   // TODO: Perhaps we should make escapify_url() deal with const properly...
   if (NULL == LogUtils::escapify_url(NULL, const_cast<char*>(str), str_len, &new_len, dst, dst_size, map)) {
-    *length = 0;
+    if (length)
+      *length = 0;
     return TS_ERROR;
   }
 
-  *length = new_len;
+  if (length)
+    *length = new_len;
+
   return TS_SUCCESS;
 }
 
-size_t
-TSStringPercentDecode(const char *src, size_t src_len, char* dst, size_t dst_size)
+TSReturnCode
+TSStringPercentDecode(const char *str, size_t str_len, char* dst, size_t dst_size, size_t *length)
 {
-  sdk_assert(sdk_sanity_check_null_ptr((void*)src) == TS_SUCCESS);
+  sdk_assert(sdk_sanity_check_null_ptr((void*)str) == TS_SUCCESS);
   sdk_assert(sdk_sanity_check_null_ptr((void*)dst) == TS_SUCCESS);
 
-  if (src_len < 0)
-    src_len = strlen(src);
+  if (str_len < 0)
+    str_len = strlen(str);
 
   // return unescapifyStr(str);
   char *buffer = dst;
-  const char *str =  src;
+  const char *src =  str;
   int s = 0; // State, which we don't really use
 
-  unescape_str(buffer, buffer+dst_size, str, str+src_len, s);
+  // TODO: We should check for "failures" here?
+  unescape_str(buffer, buffer+dst_size, src, src+str_len, s);
   *buffer = '\0';
+  if (length)
+    *length = (buffer - dst);
 
-  return buffer - dst;
+  return TS_SUCCESS;
 }
 
-
-
 TSReturnCode
 TSUrlPercentEncode(TSMBuffer bufp, TSMLoc obj, char *dst, size_t dst_size, size_t *length, const unsigned char *map)
 {
   sdk_assert(sdk_sanity_check_mbuffer(bufp) == TS_SUCCESS);
   sdk_assert(sdk_sanity_check_url_handle(obj) == TS_SUCCESS);
-  sdk_assert(sdk_sanity_check_null_ptr((void*)length) == TS_SUCCESS);
 
   char *url;
   int url_len;

Modified: trafficserver/traffic/trunk/proxy/InkAPITest.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/InkAPITest.cc?rev=1227956&r1=1227955&r2=1227956&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/InkAPITest.cc (original)
+++ trafficserver/traffic/trunk/proxy/InkAPITest.cc Fri Jan  6 05:07:01 2012
@@ -7661,18 +7661,19 @@ REGRESSION_TEST(SDK_API_OVERRIDABLE_CONF
 }
 
 ////////////////////////////////////////////////
-// SDK_API_PERCENT_ENCODING
+// SDK_API_ENCODING
 //
 // Unit Test for API: TSStringPercentEncode
 //                    TSUrlPercentEncode
 //                    TSStringPercentDecode
 ////////////////////////////////////////////////
 
-REGRESSION_TEST(SDK_API_PERCENT_ENCODING) (RegressionTest * test, int atype, int *pstatus)
+REGRESSION_TEST(SDK_API_ENCODING) (RegressionTest * test, int atype, int *pstatus)
 {
   const char *url = "http://www.example.com/foo?fie= \"#%<>[]\\^`{}~&bar={test}&fum=Apache Traffic Server";
   const char *url_encoded =
     "http://www.example.com/foo?fie=%20%22%23%25%3C%3E%5B%5D%5C%5E%60%7B%7D%7E&bar=%7Btest%7D&fum=Apache%20Traffic%20Server";
+  const char *url_base64 = "aHR0cDovL3d3dy5leGFtcGxlLmNvbS9mb28/ZmllPSAiIyU8PltdXF5ge31+JmJhcj17dGVzdH0mZnVtPUFwYWNoZSBUcmFmZmljIFNlcnZlcg==";
   char buf[1024];
   size_t length;
   bool success = true;
@@ -7684,21 +7685,50 @@ REGRESSION_TEST(SDK_API_PERCENT_ENCODING
     if (strcmp(buf, url_encoded)) {
       SDK_RPRINT(test, "TSStringPercentEncode", "TestCase1", TC_FAIL, "Failed on %s != %s", buf, url_encoded);
       success = false;
+    } else {
+      SDK_RPRINT(test, "TSStringPercentEncode", "TestCase1", TC_PASS, "ok");
     }
   }
 
-  length = TSStringPercentDecode(url_encoded, strlen(url_encoded), buf, sizeof(buf));
-  if (length != strlen(url) || strcmp(buf, url)) {
-    SDK_RPRINT(test, "TSStringPercentDecode", "TestCase1", TC_FAIL, "Failed on %s != %s", buf, url);
+  if (TS_SUCCESS != TSStringPercentDecode(url_encoded, strlen(url_encoded), buf, sizeof(buf), &length)) {
+    SDK_RPRINT(test, "TSStringPercentDecode", "TestCase1", TC_FAIL, "Failed on %s", url_encoded);
     success = false;
+  } else {
+    if (length != strlen(url) || strcmp(buf, url)) {
+      SDK_RPRINT(test, "TSStringPercentDecode", "TestCase1", TC_FAIL, "Failed on %s != %s", buf, url);
+      success = false;
+    } else {
+      SDK_RPRINT(test, "TSStringPercentDecode", "TestCase1", TC_PASS, "ok");
+    }
   }
 
-  if (success) {
-    *pstatus = REGRESSION_TEST_PASSED;
-    SDK_RPRINT(test, "TSStringPercentEncode", "TestCase1", TC_PASS, "ok");
+  if (TS_SUCCESS != TSBase64Encode(url, strlen(url), buf, sizeof(buf), &length)) {
+    SDK_RPRINT(test, "TSBase64Encode", "TestCase1", TC_FAIL, "Failed on %s", url);
+    success = false;
   } else {
-    *pstatus = REGRESSION_TEST_FAILED;
+    if (length != strlen(url_base64) || strcmp(buf, url_base64)) {
+      SDK_RPRINT(test, "TSBase64Encode", "TestCase1", TC_FAIL, "Failed on %s != %s", buf, url_base64);
+      success = false;
+    }  else {
+      SDK_RPRINT(test, "TSBase64Encode", "TestCase1", TC_PASS, "ok");
+    }
   }
 
+  if (TS_SUCCESS != TSBase64Decode(url_base64, strlen(url_base64), (unsigned char*)buf, sizeof(buf), &length)) {
+    SDK_RPRINT(test, "TSBase64Decode", "TestCase1", TC_FAIL, "Failed on %s", url_base64);
+    success = false;
+  } else {
+    printf("LENGTH is %d vs %d\n", (int)length, (int)strlen(url));
+    printf("BUF is %s vs %s\n", buf, url);
+    if (length != strlen(url) || strcmp(buf, url)) {
+      SDK_RPRINT(test, "TSBase64Decode", "TestCase1", TC_FAIL, "Failed on %s != %s", buf, url);
+      success = false;
+    } else {
+      SDK_RPRINT(test, "TSBase64Decode", "TestCase1", TC_PASS, "ok");
+    }
+  }
+
+  *pstatus = success ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED;
+
   return;
 }

Modified: trafficserver/traffic/trunk/proxy/api/ts/ts.h.in
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/api/ts/ts.h.in?rev=1227956&r1=1227955&r2=1227956&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/api/ts/ts.h.in (original)
+++ trafficserver/traffic/trunk/proxy/api/ts/ts.h.in Fri Jan  6 05:07:01 2012
@@ -1587,7 +1587,7 @@ extern "C"
      @param map optional (can be NULL) map of characters to encode.
 
   */
-  tsapi TSReturnCode TSStringPercentEncode(const char* str, int str_len, char *dst, size_t dst_size, size_t *length, const unsigned char *map);
+  tsapi TSReturnCode TSStringPercentEncode(const char *str, int str_len, char *dst, size_t dst_size, size_t *length, const unsigned char *map);
 
   /**
      Similar to TSStringPercentEncode(), but works on a URL object.
@@ -1608,13 +1608,14 @@ extern "C"
      in which case they overwrite. The decoded string is always 
      guaranteed to be no longer than the source string.
 
-     @param src the string to decode (and possibly write to).
-     @param src_len length of the input string (or -1).
+     @param str the string to decode (and possibly write to).
+     @param str_len length of the input string (or -1).
      @param dst output buffer (can be the same as src).
      @param dst_len size of the output buffer.
+     @param length amount of data written to the destination buffer.
 
   */
-  tsapi size_t TSStringPercentDecode(const char *src, size_t src_len, char* dst, size_t dst_size);
+  tsapi TSReturnCode TSStringPercentDecode(const char *str, size_t str_len, char *dst, size_t dst_size, size_t *length);
 
 
 
@@ -3017,8 +3018,8 @@ extern "C"
   tsapi TSReturnCode TSHttpTxnPrivateSessionSet(TSHttpTxn txnp, int private_session);
 
   /* Expose internal Base64 Encoding / Decoding */
-  tsapi size_t TSBase64Decode(const char *input, size_t length, unsigned char *dst, size_t dst_size);
-  tsapi size_t TSBase64Encode(const char *input, size_t length, char *dst, size_t dst_size);
+  tsapi TSReturnCode TSBase64Decode(const char *str, size_t str_len, unsigned char *dst, size_t dst_size, size_t *length);
+  tsapi TSReturnCode TSBase64Encode(const char *str, size_t str_len, char *dst, size_t dst_size, size_t *length);
 
 #ifdef __cplusplus
 }

Modified: trafficserver/traffic/trunk/proxy/logging/LogUtils.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/logging/LogUtils.cc?rev=1227956&r1=1227955&r2=1227956&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/logging/LogUtils.cc (original)
+++ trafficserver/traffic/trunk/proxy/logging/LogUtils.cc Fri Jan  6 05:07:01 2012
@@ -416,7 +416,7 @@ LogUtils::escapify_url(Arena *arena, cha
     }
     from++;
   }
-  *to = 0;                      // null terminate string
+  *to = '\0';                      // null terminate string
 
   *len_out = out_len;
   return new_url;