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);
}
/*-------------------------------------------------------------------------