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 2010/09/29 19:32:47 UTC

svn commit: r1002764 - in /trafficserver/traffic/trunk/proxy/hdrs: MIME.cc MIME.h

Author: zwoop
Date: Wed Sep 29 17:32:47 2010
New Revision: 1002764

URL: http://svn.apache.org/viewvc?rev=1002764&view=rev
Log:
TS-471 Make it possible to "write" Content-Length headers > 2GB.

Modified:
    trafficserver/traffic/trunk/proxy/hdrs/MIME.cc
    trafficserver/traffic/trunk/proxy/hdrs/MIME.h

Modified: trafficserver/traffic/trunk/proxy/hdrs/MIME.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/hdrs/MIME.cc?rev=1002764&r1=1002763&r2=1002764&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/hdrs/MIME.cc (original)
+++ trafficserver/traffic/trunk/proxy/hdrs/MIME.cc Wed Sep 29 17:32:47 2010
@@ -2338,6 +2338,17 @@ mime_field_value_set_uint(HdrHeap * heap
   -------------------------------------------------------------------------*/
 
 void
+mime_field_value_set_int64(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, int64 value)
+{
+  char buf[20];
+  int len = mime_format_int64(buf, value, sizeof(buf));
+  mime_field_value_set(heap, mh, field, buf, len, 1);
+}
+
+/*-------------------------------------------------------------------------
+  -------------------------------------------------------------------------*/
+
+void
 mime_field_value_set_date(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, time_t value)
 {
   char buf[33];
@@ -3188,37 +3199,28 @@ mime_field_length_get(MIMEField * field)
 /*-------------------------------------------------------------------------
   -------------------------------------------------------------------------*/
 
-int
-mime_format_int(char *buf, int32 val, size_t buf_len)
+// This is a little helper for the INT formatting, don't use directly!
+inline
+int format_small_int(char* buf, int32 val, size_t buf_len)
 {
-  if ((val<0) || (val>= 100000)) {
-    int ret = snprintf(buf, buf_len, "%d", val);
-    return (ret >= 0 ? ret : 0);
-  }
+  ink_assert(val > 0 && val < 100000);
 
-  if (val < 100) {
-    if (val < 10)               // 0 - 9
-    {
-      buf[0] = '0' + val;
-      return (1);
-    } else                      // 10 - 99
-    {
+  if (val < 10) {              // 0 - 9
+    buf[0] = '0' + val;
+    return 1;
+  } else if (val < 100) {              // 10 - 99
       buf[1] = '0' + (val % 10);
       val = val / 10;
       buf[0] = '0' + (val % 10);
-      return (2);
-    }
-  } else {
-    if (val < 1000)             // 100 - 999
-    {
+      return 2;
+  } else if (val < 1000) {             // 100 - 999
       buf[2] = '0' + (val % 10);
       val = val / 10;
       buf[1] = '0' + (val % 10);
       val = val / 10;
       buf[0] = '0' + (val % 10);
-      return (3);
-    } else if (val < 10000)     // 1000 - 9999
-    {
+      return 3;
+  } else if (val < 10000) {    // 1000 - 9999
       buf[3] = '0' + (val % 10);
       val = val / 10;
       buf[2] = '0' + (val % 10);
@@ -3226,9 +3228,8 @@ mime_format_int(char *buf, int32 val, si
       buf[1] = '0' + (val % 10);
       val = val / 10;
       buf[0] = '0' + (val % 10);
-      return (4);
-    } else                      // 10000 - 99999
-    {
+      return 4;
+  } else {                     // 10000 - 99999
       buf[4] = '0' + (val % 10);
       val = val / 10;
       buf[3] = '0' + (val % 10);
@@ -3238,9 +3239,23 @@ mime_format_int(char *buf, int32 val, si
       buf[1] = '0' + (val % 10);
       val = val / 10;
       buf[0] = '0' + (val % 10);
-      return (5);
-    }
+      return 5;
+  }
+
+  return 0;
+}
+
+/*-------------------------------------------------------------------------
+  -------------------------------------------------------------------------*/
+int
+mime_format_int(char *buf, int32 val, size_t buf_len)
+{
+  if ((val<0) || (val>= 100000)) {
+    int ret = snprintf(buf, buf_len, "%d", val);
+    return (ret >= 0 ? ret : 0);
   }
+
+  return format_small_int(buf, val, buf_len);
 }
 
 /*-------------------------------------------------------------------------
@@ -3254,51 +3269,21 @@ mime_format_uint(char *buf, uint32 val, 
     return (ret >= 0 ? ret : 0);
   }
 
-  if (val < 100) {
-    if (val < 10)               // 0 - 9
-    {
-      buf[0] = '0' + val;
-      return (1);
-    } else                      // 10 - 99
-    {
-      buf[1] = '0' + (val % 10);
-      val = val / 10;
-      buf[0] = '0' + (val % 10);
-      return (2);
-    }
-  } else {
-    if (val < 1000)             // 100 - 999
-    {
-      buf[2] = '0' + (val % 10);
-      val = val / 10;
-      buf[1] = '0' + (val % 10);
-      val = val / 10;
-      buf[0] = '0' + (val % 10);
-      return (3);
-    } else if (val < 10000)     // 1000 - 9999
-    {
-      buf[3] = '0' + (val % 10);
-      val = val / 10;
-      buf[2] = '0' + (val % 10);
-      val = val / 10;
-      buf[1] = '0' + (val % 10);
-      val = val / 10;
-      buf[0] = '0' + (val % 10);
-      return (4);
-    } else                      // 10000 - 99999
-    {
-      buf[4] = '0' + (val % 10);
-      val = val / 10;
-      buf[3] = '0' + (val % 10);
-      val = val / 10;
-      buf[2] = '0' + (val % 10);
-      val = val / 10;
-      buf[1] = '0' + (val % 10);
-      val = val / 10;
-      buf[0] = '0' + (val % 10);
-      return (5);
-    }
+  return format_small_int(buf, val, buf_len);
+}
+
+/*-------------------------------------------------------------------------
+  -------------------------------------------------------------------------*/
+
+int
+mime_format_int64(char *buf, int64 val, size_t buf_len)
+{
+  if ((val<0) || (val>= 100000)) {
+    int ret = snprintf(buf, buf_len, "%lld", val);
+    return (ret >= 0 ? ret : 0);
   }
+
+  return format_small_int(buf, val, buf_len);
 }
 
 /*-------------------------------------------------------------------------

Modified: trafficserver/traffic/trunk/proxy/hdrs/MIME.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/hdrs/MIME.h?rev=1002764&r1=1002763&r2=1002764&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/hdrs/MIME.h (original)
+++ trafficserver/traffic/trunk/proxy/hdrs/MIME.h Wed Sep 29 17:32:47 2010
@@ -144,6 +144,7 @@ struct MIMEField
   void value_set(HdrHeap * heap, MIMEHdrImpl * mh, const char *value, int length);
   void value_set_int(HdrHeap * heap, MIMEHdrImpl * mh, int32 value);
   void value_set_uint(HdrHeap * heap, MIMEHdrImpl * mh, uint32 value);
+  void value_set_int64(HdrHeap * heap, MIMEHdrImpl * mh, int64 value);
   void value_set_date(HdrHeap * heap, MIMEHdrImpl * mh, time_t value);
   void value_clear(HdrHeap * heap, MIMEHdrImpl * mh);
   // MIME standard separator ',' is used as the default value
@@ -653,6 +654,7 @@ inkcoreapi void mime_field_value_set(Hdr
                                      const char *value, int length, bool must_copy_string);
 void mime_field_value_set_int(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, int32 value);
 void mime_field_value_set_uint(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, uint32 value);
+void mime_field_value_set_int64(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, int64 value);
 void mime_field_value_set_date(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, time_t value);
 void mime_field_name_value_set(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field,
                                int16 name_wks_idx_or_neg1, const char *name,
@@ -690,6 +692,7 @@ const char *mime_str_u16_set(HdrHeap * h
 int mime_field_length_get(MIMEField * field);
 int mime_format_int(char *buf, int32 val, size_t buf_len);
 int mime_format_uint(char *buf, uint32 val, size_t buf_len);
+int mime_format_int64(char *buf, int64 val, size_t buf_len);
 
 void mime_days_since_epoch_to_mdy_slowcase(unsigned int days_since_jan_1_1970,
                                            int *m_return, int *d_return, int *y_return);
@@ -802,6 +805,12 @@ MIMEField::value_set_uint(HdrHeap * heap
 }
 
 inline void
+MIMEField::value_set_int64(HdrHeap * heap, MIMEHdrImpl * mh, int64 value)
+{
+  mime_field_value_set_int64(heap, mh, this, value);
+}
+
+inline void
 MIMEField::value_set_date(HdrHeap * heap, MIMEHdrImpl * mh, time_t value)
 {
   mime_field_value_set_date(heap, mh, this, value);
@@ -898,6 +907,7 @@ public:
   void value_set(const char *name, int name_length, const char *value, int value_length);
   void value_set_int(const char *name, int name_length, int32 value);
   void value_set_uint(const char *name, int name_length, uint32 value);
+  void value_set_int64(const char *name, int name_length, int64 value);
   void value_set_date(const char *name, int name_length, time_t value);
   // MIME standard separator ',' is used as the default value
   // Other separators (e.g. ';' in Set-cookie/Cookie) are also possible
@@ -907,6 +917,7 @@ public:
   void field_value_set(MIMEField * field, const char *value, int value_length);
   void field_value_set_int(MIMEField * field, int32 value);
   void field_value_set_uint(MIMEField * field, uint32 value);
+  void field_value_set_int64(MIMEField * field, int64 value);
   void field_value_set_date(MIMEField * field, time_t value);
   // MIME standard separator ',' is used as the default value
   // Other separators (e.g. ';' in Set-cookie/Cookie) are also possible
@@ -1249,6 +1260,12 @@ MIMEHdr::field_value_set_uint(MIMEField 
 }
 
 inline void
+MIMEHdr::field_value_set_int64(MIMEField * field, int64 value)
+{
+  field->value_set_uint(m_heap, m_mime, value);
+}
+
+inline void
 MIMEHdr::field_value_set_date(MIMEField * field, time_t value)
 {
   field->value_set_date(m_heap, m_mime, value);
@@ -1292,6 +1309,14 @@ MIMEHdr::value_set_uint(const char *name
 }
 
 inline void
+MIMEHdr::value_set_int64(const char *name, int name_length, int64 value)
+{
+  MIMEField *field;
+  field = mime_hdr_prepare_for_value_set(m_heap, m_mime, name, name_length);
+  field->value_set_int64(m_heap, m_mime, value);
+}
+
+inline void
 MIMEHdr::value_set_date(const char *name, int name_length, time_t value)
 {
   MIMEField *field;
@@ -1500,8 +1525,13 @@ MIMEHdr::set_age(time_t value)
 {
   if (value < 0)
     value_set_uint(MIME_FIELD_AGE, MIME_LEN_AGE, (uint32)INT_MAX + 1);
-  else
-    value_set_uint(MIME_FIELD_AGE, MIME_LEN_AGE, value); // SHOULD BE int64
+  else {
+    if (sizeof(time_t) > 4) {
+      value_set_int64(MIME_FIELD_AGE, MIME_LEN_AGE, value);
+    } else {
+      value_set_uint(MIME_FIELD_AGE, MIME_LEN_AGE, value);
+    }
+  }
 }
 
 /*-------------------------------------------------------------------------
@@ -1510,7 +1540,7 @@ MIMEHdr::set_age(time_t value)
 inline void
 MIMEHdr::set_content_length(int64 value)
 {
-  value_set_int(MIME_FIELD_CONTENT_LENGTH, MIME_LEN_CONTENT_LENGTH, value);
+  value_set_int64(MIME_FIELD_CONTENT_LENGTH, MIME_LEN_CONTENT_LENGTH, value);
 }
 
 /*-------------------------------------------------------------------------