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

[5/5] git commit: Initial tests working.

Initial tests working.


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/86631b8d
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/86631b8d
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/86631b8d

Branch: refs/heads/master
Commit: 86631b8df82128499e266ae5e803fed831863211
Parents: 8ab9154
Author: Alan M. Carroll <am...@network-geographics.com>
Authored: Sun May 27 09:25:41 2012 -0500
Committer: Alan M. Carroll <am...@network-geographics.com>
Committed: Sun May 27 09:25:41 2012 -0500

----------------------------------------------------------------------
 lib/ts/TsBuffer.h       |   57 +++++++++++++++++---
 lib/tsconfig/TsValue.cc |    6 +-
 lib/tsconfig/TsValue.h  |    6 +-
 lib/wccp/WccpConfig.cc  |    2 +-
 lib/wccp/WccpLocal.h    |    2 +-
 proxy/ControlBase.cc    |    2 +-
 proxy/hdrs/HdrTest.cc   |   43 +++++++++++++++
 proxy/hdrs/URL.cc       |  123 +++++++++++++++++++++++++++++++++++++++++-
 8 files changed, 223 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/86631b8d/lib/ts/TsBuffer.h
----------------------------------------------------------------------
diff --git a/lib/ts/TsBuffer.h b/lib/ts/TsBuffer.h
index 45aabf9..d784c02 100644
--- a/lib/ts/TsBuffer.h
+++ b/lib/ts/TsBuffer.h
@@ -55,8 +55,15 @@ namespace ts {
     /// Construct from pointer and size.
     Buffer(
       char* ptr, ///< Pointer to buffer.
-      size_t n ///< Size of buffer.
+      size_t n = 0 ///< Size of buffer.
     );
+    /** Construct from two pointers.
+	@note This presumes a half open range, (start, end]
+    */
+    Buffer(
+	   char* start, ///< First valid character.
+	   char* end ///< First invalid character.
+	   );
 
     /** Equality.
         @return @c true if @a that refers to the same memory as @a this,
@@ -106,7 +113,7 @@ namespace ts {
     /// @return @c this object.
     self& set(
       char* ptr, ///< Buffer address.
-      size_t n ///< Buffer size.
+      size_t n = 0 ///< Buffer size.
     );
     /// Reset to empty.
     self& reset();
@@ -129,8 +136,15 @@ namespace ts {
     /// Construct from pointer and size.
     ConstBuffer(
       char const * ptr, ///< Pointer to buffer.
-      size_t n ///< Size of buffer.
+      size_t n = 0///< Size of buffer.
     );
+    /** Construct from two pointers.
+	@note This presumes a half open range (start, end]
+    */
+    ConstBuffer(
+	   char const* start, ///< First valid character.
+	   char const* end ///< First invalid character.
+	   );
     /// Construct from writable buffer.
     ConstBuffer(
         Buffer const& buffer ///< Buffer to copy.
@@ -167,6 +181,10 @@ namespace ts {
         @return @a this object.
     */
     self& operator++();
+    /** Discard the first @a n characters.
+	@return @a this object.
+    */
+    self& operator += (size_t n);
 
     /// Check for empty buffer.
     /// @return @c true if the buffer has a zero pointer @b or size.
@@ -192,8 +210,15 @@ namespace ts {
     /// @return @c this object.
     self& set(
       char const * ptr, ///< Buffer address.
-      size_t n ///< Buffer size.
+      size_t n = 0 ///< Buffer size.
     );
+    /** Set from 2 pointers.
+	@note This presumes a half open range (start, end]
+    */
+    self& set(
+	   char const* start, ///< First valid character.
+	   char const* end ///< First invalid character.
+	   );
     /// Reset to empty.
     self& reset();
 
@@ -265,6 +290,7 @@ namespace ts {
   inline Buffer::Buffer() { }
   inline Buffer::Buffer(char* ptr, size_t n) : _ptr(ptr), _size(n) { }
   inline Buffer& Buffer::set(char* ptr, size_t n) { _ptr = ptr; _size = n; return *this; }
+  inline Buffer::Buffer(char* start, char* end) : _ptr(start), _size(end - start) { }
   inline Buffer& Buffer::reset() { _ptr = 0; _size = 0 ; return *this; }
   inline bool Buffer::operator != (self const& that) const { return ! (*this == that); }
   inline bool Buffer::operator != (ConstBuffer const& that) const { return ! (*this == that); }
@@ -278,7 +304,8 @@ namespace ts {
   inline Buffer::operator pseudo_bool() const { return _ptr && _size ? &self::operator! : 0; }
   inline char Buffer::operator * () const { return *_ptr; }
   inline Buffer& Buffer::operator++ () {
-    if (_ptr && _size) { ++_ptr; --_size; }
+    ++_ptr;
+    --_size;
     return *this;
   }
   inline char * Buffer::data() const { return _ptr; }
@@ -286,8 +313,16 @@ namespace ts {
 
   inline ConstBuffer::ConstBuffer() { }
   inline ConstBuffer::ConstBuffer(char const* ptr, size_t n) : _ptr(ptr), _size(n) { }
+  inline ConstBuffer::ConstBuffer(char const* start, char const* end) : _ptr(start), _size(end - start) { }
   inline ConstBuffer::ConstBuffer(Buffer const& that) : _ptr(that._ptr), _size(that._size) { }
   inline ConstBuffer& ConstBuffer::set(char const* ptr, size_t n) { _ptr = ptr; _size = n; return *this; }
+
+  inline ConstBuffer& ConstBuffer::set(char const* start, char const* end) {
+    _ptr = start;
+    _size = end - start;
+    return *this;
+  }
+
   inline ConstBuffer& ConstBuffer::reset() { _ptr = 0; _size = 0 ; return *this; }
   inline bool ConstBuffer::operator != (self const& that) const { return ! (*this == that); }
   inline bool ConstBuffer::operator != (Buffer const& that) const { return ! (*this == that); }
@@ -302,7 +337,13 @@ namespace ts {
   inline ConstBuffer::operator pseudo_bool() const { return _ptr && _size ? &self::operator! : 0; }
   inline char ConstBuffer::operator * () const { return *_ptr; }
   inline ConstBuffer& ConstBuffer::operator++ () {
-    if (_ptr && _size) { ++_ptr; --_size; }
+    ++_ptr;
+    --_size;
+    return *this;
+  }
+  inline ConstBuffer& ConstBuffer::operator += (size_t n) {
+    _ptr += n;
+    _size -= n;
     return *this;
   }
   inline char const * ConstBuffer::data() const { return _ptr; }
@@ -313,7 +354,7 @@ namespace ts {
   }
 
   inline ConstBuffer ConstBuffer::splitOn(char const* p) {
-    self zret(0,0); // default to empty return.
+    self zret(0); // default to empty return.
     if (this->contains(p)) {
       size_t n = p - _ptr;
       zret.set(_ptr, n);
@@ -332,7 +373,7 @@ namespace ts {
   }
 
   inline ConstBuffer ConstBuffer::after(char const* p) const {
-    return this->contains(p) ? self(p + 1, (_size-(p-_ptr))-1) : self(0,0);
+    return this->contains(p) ? self(p + 1, (_size-(p-_ptr))-1) : self(0);
   }
   inline ConstBuffer ConstBuffer::after(char c) const {
     return this->after(this->find(c));

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/86631b8d/lib/tsconfig/TsValue.cc
----------------------------------------------------------------------
diff --git a/lib/tsconfig/TsValue.cc b/lib/tsconfig/TsValue.cc
index 71338bf..3af6fa5 100644
--- a/lib/tsconfig/TsValue.cc
+++ b/lib/tsconfig/TsValue.cc
@@ -38,8 +38,8 @@
 // ---------------------------------------------------------------------------
 namespace ts { namespace config {
 // ---------------------------------------------------------------------------
-Buffer const detail::NULL_BUFFER(0,0);
-ConstBuffer const detail::NULL_CONST_BUFFER(0,0);
+Buffer const detail::NULL_BUFFER(0);
+ConstBuffer const detail::NULL_CONST_BUFFER(0);
 detail::ValueItem detail::ValueTableImpl::NULL_ITEM(VoidValue);
 detail::PseudoBool::Type const detail::PseudoBool::FALSE = 0;
 detail::PseudoBool::Type const detail::PseudoBool::TRUE = &detail::PseudoBool::operator !;
@@ -333,7 +333,7 @@ Configuration::getRoot() const {
 Rv<Configuration>
 Configuration::loadFromPath(char const* path) {
     Rv<Configuration> zret;
-    Buffer buffer(0,0);
+    Buffer buffer(0);
     FILE* in = fopen(path, "r");
 
     if (in) {

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/86631b8d/lib/tsconfig/TsValue.h
----------------------------------------------------------------------
diff --git a/lib/tsconfig/TsValue.h b/lib/tsconfig/TsValue.h
index eb81b06..95ccbf6 100644
--- a/lib/tsconfig/TsValue.h
+++ b/lib/tsconfig/TsValue.h
@@ -643,8 +643,8 @@ namespace detail {
   inline ValueItem const& ValueTable::operator [] (ValueIndex idx) const { return const_cast<self*>(this)->operator [] (idx); }
   inline ValueTable& ValueTable::reset() { _ptr = 0; return *this; }
 
-  inline ValueItem::ValueItem() : _type(VoidValue), _text(0,0), _name(0,0) {}
-  inline ValueItem::ValueItem(ValueType type) : _type(type), _text(0,0), _name(0,0) {}
+  inline ValueItem::ValueItem() : _type(VoidValue), _text(0), _name(0) {}
+  inline ValueItem::ValueItem(ValueType type) : _type(type), _text(0), _name(0) {}
   inline ValueType ValueItem::getType() const { return _type; }
 }
 
@@ -721,7 +721,7 @@ inline Path& Path::append(size_t index) { this->instance()->_elements.push_back(
 inline size_t Path::count() const { return _ptr ? _ptr->_elements.size() : 0; }
 inline ConstBuffer const& Path::operator [] (size_t idx) const { return _ptr ? _ptr->_elements[idx] : detail::NULL_CONST_BUFFER; }
 
-inline Path::Parser::Parser() : _input(0,0), _c(0) { }
+inline Path::Parser::Parser() : _input(0), _c(0) { }
 inline Path::Parser::Parser( ConstBuffer const& text ) : _input(text), _c(text._ptr) { }
 inline bool Path::Parser::hasInput() const { return _input._ptr && _input._ptr + _input._size > _c; }
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/86631b8d/lib/wccp/WccpConfig.cc
----------------------------------------------------------------------
diff --git a/lib/wccp/WccpConfig.cc b/lib/wccp/WccpConfig.cc
index 3eb5abd..f24c438 100644
--- a/lib/wccp/WccpConfig.cc
+++ b/lib/wccp/WccpConfig.cc
@@ -423,7 +423,7 @@ load_security (
   int src_line;
   ts::ConstBuffer text;
 
-  zret.result().set(0,0);
+  zret.result().set(0);
 
   src_line = setting.getSourceLine();
   if (ts::config::GroupValue == setting.getType()) {

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/86631b8d/lib/wccp/WccpLocal.h
----------------------------------------------------------------------
diff --git a/lib/wccp/WccpLocal.h b/lib/wccp/WccpLocal.h
index 3449a4e..b8a83ea 100644
--- a/lib/wccp/WccpLocal.h
+++ b/lib/wccp/WccpLocal.h
@@ -3239,7 +3239,7 @@ detail::Assignment::getMask() const {
   return *m_mask_assign;
 }
 
-inline MsgBuffer::MsgBuffer() : super(0,0), _count(0) { }
+inline MsgBuffer::MsgBuffer() : super(0), _count(0) { }
 inline MsgBuffer::MsgBuffer(super const& that) : super(that), _count(0) { }
 inline MsgBuffer::MsgBuffer(void* p, size_t n)
   : super(static_cast<char*>(p),n)

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/86631b8d/proxy/ControlBase.cc
----------------------------------------------------------------------
diff --git a/proxy/ControlBase.cc b/proxy/ControlBase.cc
index d74768d..0b97e39 100644
--- a/proxy/ControlBase.cc
+++ b/proxy/ControlBase.cc
@@ -351,7 +351,7 @@ void TextMod::print(FILE* f) const {
   fprintf(f, "%s=%*s  ", this->name(), static_cast<int>(text.size()), text.data());
 }
 
-TextMod::TextMod() : text(0,0) {}
+TextMod::TextMod() : text(0) {}
 TextMod::~TextMod() {
   free(text.data());
 }

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/86631b8d/proxy/hdrs/HdrTest.cc
----------------------------------------------------------------------
diff --git a/proxy/hdrs/HdrTest.cc b/proxy/hdrs/HdrTest.cc
index 2c45c1d..6fa7628 100644
--- a/proxy/hdrs/HdrTest.cc
+++ b/proxy/hdrs/HdrTest.cc
@@ -388,10 +388,31 @@ HdrTest::test_url()
     "http://foo:bar@some.place:80",
     "http://foo:bar@some.place:80/",
 
+    // Some address stuff
+    "http://172.16.28.101",
+    "http://172.16.28.101:8080",
+    "http://[::]",
+    "http://[::1]",
+    "http://[fc01:172:16:28::101]",
+    "http://[fc01:172:16:28::101]:80",
+    "http://[fc01:172:16:28:BAAD:BEEF:DEAD:101]",
+    "http://[fc01:172:16:28:BAAD:BEEF:DEAD:101]:8080",
+    "http://172.16.28.101/some/path",
+    "http://172.16.28.101:8080/some/path",
+    "http://[::1]/some/path",
+    "http://[fc01:172:16:28::101]/some/path",
+    "http://[fc01:172:16:28::101]:80/some/path",
+    "http://[fc01:172:16:28:BAAD:BEEF:DEAD:101]/some/path",
+    "http://[fc01:172:16:28:BAAD:BEEF:DEAD:101]:8080/some/path",
+    "http://172.16.28.101/",
+    "http://[fc01:172:16:28:BAAD:BEEF:DEAD:101]:8080/",
+
     "foo:bar@some.place",
     "foo:bar@some.place/",
     "http://foo:bar@some.place",
     "http://foo:bar@some.place/",
+    "http://foo:bar@[::1]:8080/",
+    "http://foo@[::1]",
 
     "mms://sm02.tsqa.example.com/0102rally.asf",
     "pnm://foo:bar@some.place:80/path;params?query#fragment",
@@ -401,6 +422,16 @@ HdrTest::test_url()
   };
   static int nstrs = sizeof(strs) / sizeof(strs[0]);
 
+  static char const* bad[] = {
+    "http://[1:2:3:4:5:6:7:8:9]",
+    "http://1:2:3:4:5:6:7:8:A:B",
+    "http://bob.com[::1]",
+    "http://[::1].com"
+    "http://foo:bar:baz@bob.com/",
+    "http://foo:bar:baz@[::1]:8080/",
+  };
+  static int nbad = sizeof(bad) / sizeof(bad[0]);
+
   int err, failed;
   URL url;
   const char *start;
@@ -456,6 +487,18 @@ HdrTest::test_url()
     url.destroy();
   }
 
+  for (i = 0 ; i < nbad ; ++i) {
+    char const* x = bad[i];
+    url.create(NULL);
+    err = url.parse(x, strlen(x));
+    url.destroy();
+    if (err == PARSE_DONE) {
+      failed = 1;
+      printf("Successfully parsed invalid url '%s'", x);
+      break;
+    }
+  }
+
   return (failures_to_status("test_url", failed));
 }
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/86631b8d/proxy/hdrs/URL.cc
----------------------------------------------------------------------
diff --git a/proxy/hdrs/URL.cc b/proxy/hdrs/URL.cc
index 8455a3a..17683c2 100644
--- a/proxy/hdrs/URL.cc
+++ b/proxy/hdrs/URL.cc
@@ -1376,6 +1376,119 @@ eof:
   return PARSE_ERROR;
 }
 
+MIMEParseResult
+amc_url_parse_internet(HdrHeap* heap, URLImpl* url,
+                       char const ** start, char const *end,
+                       bool copy_strings_p)
+{
+  ts::ConstBuffer cur(*start, end);
+  char const* point; // last point of interest.
+  char const* bracket = 0; // marker for open bracket, if any.
+  ts::ConstBuffer user(0), passw(0), host(0), port(0);
+  static size_t const MAX_COLON = 8; // max # of valid colons.
+  size_t n_colon = 0;
+  char const* last_colon; // pointer to last colon seen.
+
+  // Do a quick check for "://"
+  if (cur._size > 3 &&
+      (((':' ^ *cur) | ('/' ^ cur[1]) | ('/' ^ cur[2])) == 0)) {
+    cur += 3;
+  } else if (':' == *cur && ((++cur)._size == 0 ||
+                             ('/' == *cur && ((++cur)._size == 0 ||
+                                              ('/' == *cur && (++cur)._size == 0))))) {
+    return PARSE_ERROR;
+  }
+  // skipped leading stuff, start real parsing.
+  point = cur._ptr;
+  while (cur._size) {
+    // Note: Each case is responsible for incrementing @a cur if
+    // appropriate!
+    char c = *cur;
+    switch (c) {
+    case ']' : // address close
+      if (0 == bracket || n_colon >= MAX_COLON)
+        return PARSE_ERROR;
+      host.set(bracket+1, cur._ptr);
+      ++cur;
+      // This must constitute the entire host so the next character must be
+      // missing (EOS), slash, or colon.
+      if (cur._size == 0 || '/' == *cur) { // done which is OK
+        last_colon = 0;
+        break;
+      } else if (':' != *cur) { // otherwise it must be a colon
+        return PARSE_ERROR;
+      }
+      /* We want to prevent more than 1 colon following so we set @a
+         n_colon appropriately.
+      */
+      n_colon = MAX_COLON - 1;
+      // FALL THROUGH
+    case ':' : // track colons, fail if too many.
+      if (++n_colon > MAX_COLON)
+        return PARSE_ERROR;
+      last_colon = cur._ptr;
+      ++cur;
+      break;
+    case '@' : // user/password marker.
+      if (user || n_colon > 1)
+        return PARSE_ERROR; // we already got one, or too many colons.
+      if (n_colon) {
+        user.set(point, last_colon);
+        passw.set(last_colon+1, cur._ptr);
+        n_colon= 0;
+        last_colon = 0;
+      } else {
+        user.set(point, cur._ptr);
+      }
+      ++cur;
+      point = cur._ptr; // interesting stuff is past '@'
+      break;
+    case '[' : // address open
+      if (bracket || point != cur._ptr) // must be first char in field
+        return PARSE_ERROR;
+      bracket = cur._ptr; // location and flag.
+      ++cur;
+      break;
+    case '/' : // we're done with this phase.
+      cur._size = 0; // cause loop exit
+      break;
+    default:
+      ++cur;
+      break;
+    };
+  }
+  // Time to pick up the pieces. At this pointer cur._ptr is the first
+  // character past the parse area.
+
+  if (user) {
+    url_user_set(heap, url, user._ptr, user._size, copy_strings_p);
+    if (passw)
+      url_password_set(heap, url, passw._ptr, passw._size, copy_strings_p);
+  }
+
+  // @a host not set means no brackets to mark explicit host.
+  if (!host) {
+    if (1 == n_colon || MAX_COLON == n_colon) { // presume port.
+      host.set(point, last_colon);
+    } else { // it's all host.
+      host.set(point, cur._ptr);
+      last_colon = 0; // prevent port setting.
+    }
+  }
+  if (host._size)
+    url_host_set(heap, url, host._ptr, host._size, copy_strings_p);
+  
+  if (last_colon) {
+    ink_debug_assert(n_colon);
+    port.set(last_colon+1, cur._ptr);
+    if (!port._size)
+      return PARSE_ERROR; // colon w/o port value.
+    url_port_set(heap, url, port._ptr, port._size, copy_strings_p);
+  }
+  if ('/' == *cur) ++cur._ptr;
+  *start = cur._ptr;
+  return PARSE_DONE;
+}
 /*-------------------------------------------------------------------------
   -------------------------------------------------------------------------*/
 
@@ -1396,7 +1509,7 @@ url_parse_http(HdrHeap * heap, URLImpl * url, const char **start, const char *en
   const char *fragment_end = NULL;
   char mask;
 
-  err = url_parse_internet(heap, url, start, end, copy_strings);
+  err = amc_url_parse_internet(heap, url, start, end, copy_strings);
   if (err < 0)
     return err;
 
@@ -1552,8 +1665,16 @@ url_print(URLImpl * url, char *buf_start, int buf_length, int *buf_index_inout,
   }
 
   if (url->m_ptr_host) {
+    // Force brackets for IPv6. Note colon must occur in first 5 characters.
+    // But it can be less (e.g. "::1").
+    int n = url->m_len_host;
+    bool bracket_p = (0 != memchr(url->m_ptr_host, ':', n > 5 ? 5 : n));
+    if (bracket_p)
+      TRY(mime_mem_print("[", 1, buf_start, buf_length, buf_index_inout, buf_chars_to_skip_inout));
     TRY(mime_mem_print(url->m_ptr_host, url->m_len_host,
                        buf_start, buf_length, buf_index_inout, buf_chars_to_skip_inout));
+    if (bracket_p)
+      TRY(mime_mem_print("]", 1, buf_start, buf_length, buf_index_inout, buf_chars_to_skip_inout));
     if (url->m_ptr_port && url->m_port) {
       TRY(mime_mem_print(":", 1, buf_start, buf_length, buf_index_inout, buf_chars_to_skip_inout));
       TRY(mime_mem_print(url->m_ptr_port, url->m_len_port,