• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

URL.h

Go to the documentation of this file.
00001 /** @file
00002 
00003   A brief file description
00004 
00005   @section license License
00006 
00007   Licensed to the Apache Software Foundation (ASF) under one
00008   or more contributor license agreements.  See the NOTICE file
00009   distributed with this work for additional information
00010   regarding copyright ownership.  The ASF licenses this file
00011   to you under the Apache License, Version 2.0 (the
00012   "License"); you may not use this file except in compliance
00013   with the License.  You may obtain a copy of the License at
00014 
00015       http://www.apache.org/licenses/LICENSE-2.0
00016 
00017   Unless required by applicable law or agreed to in writing, software
00018   distributed under the License is distributed on an "AS IS" BASIS,
00019   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00020   See the License for the specific language governing permissions and
00021   limitations under the License.
00022  */
00023 
00024 #ifndef __URL_H__
00025 #define __URL_H__
00026 
00027 #include "Arena.h"
00028 #include "HdrToken.h"
00029 #include "HdrHeap.h"
00030 #include "INK_MD5.h"
00031 #include "MMH.h"
00032 #include "MIME.h"
00033 
00034 #include "ink_apidefs.h"
00035 
00036 enum URLType
00037 {
00038   URL_TYPE_NONE,
00039   URL_TYPE_HTTP,
00040   URL_TYPE_HTTPS
00041 };
00042 
00043 struct URLImpl:public HdrHeapObjImpl
00044 {
00045   // HdrHeapObjImpl is 4 bytes
00046   uint16_t m_len_scheme;
00047   uint16_t m_len_user;
00048   uint16_t m_len_password;
00049   uint16_t m_len_host;
00050   uint16_t m_len_port;
00051   uint16_t m_len_path;
00052   uint16_t m_len_params;
00053   uint16_t m_len_query;
00054   uint16_t m_len_fragment;
00055   uint16_t m_len_printed_string;
00056   // 4 + 20 byte = 24, 8 bytes aligned
00057 
00058   const char *m_ptr_scheme;
00059   const char *m_ptr_user;
00060   const char *m_ptr_password;
00061   const char *m_ptr_host;
00062   const char *m_ptr_port;
00063   const char *m_ptr_path;
00064   const char *m_ptr_params;
00065   const char *m_ptr_query;
00066   const char *m_ptr_fragment;
00067   const char *m_ptr_printed_string;
00068   // pointer aligned (4 or 8)
00069 
00070   // Tokenized values
00071   int16_t m_scheme_wks_idx;
00072   uint16_t m_port;
00073   uint8_t m_url_type;             // e.g. HTTP
00074   uint8_t m_type_code;            // RFC 1738 limits type code to 1 char
00075   // 6 bytes
00076 
00077   uint32_t m_clean:1;
00078   // 8 bytes + 1 bit, will result in padding
00079 
00080   // Marshaling Functions
00081   int marshal(MarshalXlate *str_xlate, int num_xlate);
00082   void unmarshal(intptr_t offset);
00083   void move_strings(HdrStrHeap *new_heap);
00084   size_t strings_length();
00085 
00086   // Sanity Check Functions
00087   void check_strings(HeapCheck *heaps, int num_heaps);
00088 };
00089 
00090 /// Crypto Hash context for URLs.
00091 /// @internal This just forwards on to another specific context but avoids
00092 /// putting that switch logic in multiple places. The working context is put
00093 /// in to class local storage (@a _obj) via placement @a new.
00094 class URLHashContext : public CryptoContext {
00095 public:
00096   URLHashContext();
00097   /// Update the hash with @a data of @a length bytes.
00098   virtual bool update(void const* data, int length);
00099   /// Finalize and extract the @a hash.
00100   virtual bool finalize(CryptoHash& hash);
00101 
00102   enum HashType { UNSPECIFIED, MD5, MMH }; ///< What type of hash we really are.
00103   static HashType Setting;
00104 
00105   /// Size of storage for placement @c new of hashing context.
00106   static size_t const OBJ_SIZE = 256;
00107 
00108 protected:
00109   char _obj[OBJ_SIZE]; ///< Raw storage for instantiated context.
00110 };
00111 
00112 inline bool URLHashContext::update(void const* data, int length) {
00113   return reinterpret_cast<CryptoContext*>(_obj)->update(data, length);
00114 }
00115 
00116 inline bool URLHashContext::finalize(CryptoHash& hash) {
00117   return reinterpret_cast<CryptoContext*>(_obj)->finalize(hash);
00118 }
00119 
00120 extern const char *URL_SCHEME_FILE;
00121 extern const char *URL_SCHEME_FTP;
00122 extern const char *URL_SCHEME_GOPHER;
00123 extern const char *URL_SCHEME_HTTP;
00124 extern const char *URL_SCHEME_HTTPS;
00125 extern const char *URL_SCHEME_WS;
00126 extern const char *URL_SCHEME_WSS;
00127 extern const char *URL_SCHEME_MAILTO;
00128 extern const char *URL_SCHEME_NEWS;
00129 extern const char *URL_SCHEME_NNTP;
00130 extern const char *URL_SCHEME_PROSPERO;
00131 extern const char *URL_SCHEME_TELNET;
00132 extern const char *URL_SCHEME_TUNNEL;
00133 extern const char *URL_SCHEME_WAIS;
00134 extern const char *URL_SCHEME_PNM;
00135 extern const char *URL_SCHEME_RTSP;
00136 extern const char *URL_SCHEME_RTSPU;
00137 extern const char *URL_SCHEME_MMS;
00138 extern const char *URL_SCHEME_MMSU;
00139 extern const char *URL_SCHEME_MMST;
00140 
00141 extern int URL_WKSIDX_FILE;
00142 extern int URL_WKSIDX_FTP;
00143 extern int URL_WKSIDX_GOPHER;
00144 extern int URL_WKSIDX_HTTP;
00145 extern int URL_WKSIDX_HTTPS;
00146 extern int URL_WKSIDX_WS;
00147 extern int URL_WKSIDX_WSS;
00148 extern int URL_WKSIDX_MAILTO;
00149 extern int URL_WKSIDX_NEWS;
00150 extern int URL_WKSIDX_NNTP;
00151 extern int URL_WKSIDX_PROSPERO;
00152 extern int URL_WKSIDX_TELNET;
00153 extern int URL_WKSIDX_TUNNEL;
00154 extern int URL_WKSIDX_WAIS;
00155 extern int URL_WKSIDX_PNM;
00156 extern int URL_WKSIDX_RTSP;
00157 extern int URL_WKSIDX_RTSPU;
00158 extern int URL_WKSIDX_MMS;
00159 extern int URL_WKSIDX_MMSU;
00160 extern int URL_WKSIDX_MMST;
00161 
00162 extern int URL_LEN_FILE;
00163 extern int URL_LEN_FTP;
00164 extern int URL_LEN_GOPHER;
00165 extern int URL_LEN_HTTP;
00166 extern int URL_LEN_HTTPS;
00167 extern int URL_LEN_WS;
00168 extern int URL_LEN_WSS;
00169 extern int URL_LEN_MAILTO;
00170 extern int URL_LEN_NEWS;
00171 extern int URL_LEN_NNTP;
00172 extern int URL_LEN_PROSPERO;
00173 extern int URL_LEN_TELNET;
00174 extern int URL_LEN_TUNNEL;
00175 extern int URL_LEN_WAIS;
00176 extern int URL_LEN_PNM;
00177 extern int URL_LEN_RTSP;
00178 extern int URL_LEN_RTSPU;
00179 extern int URL_LEN_MMS;
00180 extern int URL_LEN_MMSU;
00181 extern int URL_LEN_MMST;
00182 
00183 /* Private */
00184 void url_adjust(MarshalXlate *str_xlate, int num_xlate);
00185 
00186 /* Public */
00187 void url_init();
00188 
00189 URLImpl *url_create(HdrHeap *heap);
00190 void url_clear(URLImpl *url_impl);
00191 void url_nuke_proxy_stuff(URLImpl *d_url);
00192 
00193 URLImpl *url_copy(URLImpl *s_url, HdrHeap *s_heap, HdrHeap *d_heap, bool inherit_strs = true);
00194 void url_copy_onto(URLImpl *s_url, HdrHeap *s_heap, URLImpl *d_url, HdrHeap *d_heap, bool inherit_strs = true);
00195 void url_copy_onto_as_server_url(URLImpl *s_url, HdrHeap *s_heap,
00196                                  URLImpl *d_url, HdrHeap *d_heap, bool inherit_strs = true);
00197 
00198 int url_print(URLImpl *u, char *buf, int bufsize, int *bufindex, int *dumpoffset);
00199 void url_describe(HdrHeapObjImpl *raw, bool recurse);
00200 
00201 int url_length_get(URLImpl *url);
00202 char *url_string_get(URLImpl *url, Arena *arena, int *length, HdrHeap *heap);
00203 void url_clear_string_ref(URLImpl *url);
00204 char *url_string_get_ref(HdrHeap *heap, URLImpl *url, int *length);
00205 void url_called_set(URLImpl *url);
00206 char *url_string_get_buf(URLImpl *url, char *dstbuf, int dstbuf_size, int *length);
00207 
00208 const char *url_scheme_get(URLImpl *url, int *length);
00209 void url_MD5_get(URLImpl *url, CryptoHash *md5);
00210 void url_host_MD5_get(URLImpl *url, CryptoHash *md5);
00211 const char *url_scheme_set(HdrHeap *heap, URLImpl *url,
00212                            const char *value, int value_wks_idx, int length, bool copy_string);
00213 
00214 /* Internet specific */
00215 void url_user_set(HdrHeap *heap, URLImpl *url, const char *value, int length, bool copy_string);
00216 void url_password_set(HdrHeap *heap, URLImpl *url, const char *value, int length, bool copy_string);
00217 void url_host_set(HdrHeap *heap, URLImpl *url, const char *value, int length, bool copy_string);
00218 void url_port_set(HdrHeap *heap, URLImpl *url, unsigned int port);
00219 
00220 /* HTTP specific */
00221 void url_path_set(HdrHeap *heap, URLImpl *url, const char *value, int length, bool copy_string);
00222 
00223 void url_type_set(URLImpl *url, unsigned int type);
00224 
00225 /* HTTP specific */
00226 void url_params_set(HdrHeap *heap, URLImpl *url, const char *value, int length, bool copy_string);
00227 void url_query_set(HdrHeap *heap, URLImpl *url, const char *value, int length, bool copy_string);
00228 void url_fragment_set(HdrHeap *heap, URLImpl *url, const char *value, int length, bool copy_string);
00229 
00230 MIMEParseResult url_parse(HdrHeap *heap, URLImpl *url, const char **start, const char *end, bool copy_strings);
00231 MIMEParseResult url_parse_no_path_component_breakdown(HdrHeap *heap, URLImpl *url,
00232                                                       const char **start, const char *end, bool copy_strings);
00233 MIMEParseResult url_parse_internet(HdrHeap *heap, URLImpl *url,
00234                                    const char **start, const char *end, bool copy_strings);
00235 MIMEParseResult url_parse_http(HdrHeap *heap, URLImpl *url, const char **start, const char *end, bool copy_strings);
00236 MIMEParseResult url_parse_http_no_path_component_breakdown(HdrHeap *heap, URLImpl *url,
00237                                                            const char **start, const char *end, bool copy_strings);
00238 
00239 char *url_unescapify(Arena *arena, const char *str, int length);
00240 
00241 void unescape_str(char *&buf, char *buf_e, const char *&str, const char *str_e, int &state);
00242 void unescape_str_tolower(char *&buf, char *end, const char *&str, const char *str_e, int &state);
00243 
00244 
00245 inline int
00246 url_canonicalize_port(int type, int port)
00247 {
00248   if (port == 0) {
00249     if (type == URL_TYPE_HTTP)
00250       port = 80;
00251     else if (type == URL_TYPE_HTTPS)
00252       port = 443;
00253   }
00254   return (port);
00255 }
00256 
00257 class URL:public HdrHeapSDKHandle
00258 {
00259 public:
00260   URLImpl *m_url_impl;
00261 
00262   URL();
00263   ~URL();
00264 
00265   int valid() const;
00266 
00267   void create(HdrHeap *h);
00268   void copy(const URL *url);
00269   void copy_shallow(const URL *url);
00270   void clear();
00271   void reset();
00272   // Note that URL::destroy() is inherited from HdrHeapSDKHandle.
00273   void nuke_proxy_stuff();
00274 
00275   int print(char *buf, int bufsize, int *bufindex, int *dumpoffset);
00276 
00277   int length_get();
00278   void clear_string_ref();
00279   char *string_get(Arena *arena, int *length = NULL);
00280   char *string_get_ref(int *length = NULL);
00281   char *string_get_buf(char *dstbuf, int dsbuf_size, int *length = NULL);
00282   void hash_get(CryptoHash *md5);
00283   void host_hash_get(CryptoHash *md5);
00284 
00285   const char *scheme_get(int *length);
00286   int scheme_get_wksidx();
00287   void scheme_set(const char *value, int length);
00288 
00289   const char *user_get(int *length);
00290   void user_set(const char *value, int length);
00291   const char *password_get(int *length);
00292   void password_set(const char *value, int length);
00293   const char *host_get(int *length);
00294   void host_set(const char *value, int length);
00295   int port_get();
00296   int port_get_raw();
00297   void port_set(int port);
00298 
00299   const char *path_get(int *length);
00300   void path_set(const char *value, int length);
00301 
00302   int type_get();
00303   void type_set(int type);
00304 
00305   const char *params_get(int *length);
00306   void params_set(const char *value, int length);
00307   const char *query_get(int *length);
00308   void query_set(const char *value, int length);
00309   const char *fragment_get(int *length);
00310   void fragment_set(const char *value, int length);
00311 
00312   MIMEParseResult parse(const char **start, const char *end);
00313   MIMEParseResult parse(const char *str, int length);
00314   MIMEParseResult parse_no_path_component_breakdown(const char *str, int length);
00315 
00316 public:
00317   static char *unescapify(Arena *arena, const char *str, int length);
00318 
00319 private:
00320 
00321   // No gratuitous copies!
00322     URL(const URL & u);
00323     URL & operator =(const URL & u);
00324 };
00325 
00326 
00327 /*-------------------------------------------------------------------------
00328   -------------------------------------------------------------------------*/
00329 
00330 inline
00331 URL::URL()
00332   : m_url_impl(NULL)
00333 {
00334 }
00335 
00336 /*-------------------------------------------------------------------------
00337   -------------------------------------------------------------------------*/
00338 
00339 inline
00340 URL::~URL()
00341 {
00342 }
00343 
00344 /*-------------------------------------------------------------------------
00345   -------------------------------------------------------------------------*/
00346 
00347 inline int
00348 URL::valid() const
00349 {
00350   return (m_heap && m_url_impl);
00351 }
00352 
00353 /*-------------------------------------------------------------------------
00354   -------------------------------------------------------------------------*/
00355 
00356 inline void
00357 URL::create(HdrHeap *heap)
00358 {
00359   if (heap) {
00360     m_heap = heap;
00361   } else if (!m_heap) {
00362     m_heap = new_HdrHeap();
00363   }
00364 
00365   m_url_impl = url_create(m_heap);
00366 }
00367 
00368 /*-------------------------------------------------------------------------
00369   -------------------------------------------------------------------------*/
00370 
00371 inline void
00372 URL::copy(const URL *url)
00373 {
00374   ink_assert(url->valid());
00375   url_copy_onto(url->m_url_impl, url->m_heap, m_url_impl, m_heap);
00376 }
00377 
00378 /*-------------------------------------------------------------------------
00379   -------------------------------------------------------------------------*/
00380 
00381 inline void
00382 URL::copy_shallow(const URL *url)
00383 {
00384   ink_assert(url->valid());
00385   this->set(url);
00386   m_url_impl = url->m_url_impl;
00387 }
00388 
00389 /*-------------------------------------------------------------------------
00390   -------------------------------------------------------------------------*/
00391 
00392 inline void
00393 URL::clear()
00394 {
00395   m_url_impl = NULL;
00396   HdrHeapSDKHandle::clear();
00397 }
00398 
00399 inline void
00400 URL::reset()
00401 {
00402   m_url_impl = NULL;
00403 }
00404 
00405 /*-------------------------------------------------------------------------
00406   -------------------------------------------------------------------------*/
00407 
00408 inline void
00409 URL::nuke_proxy_stuff()
00410 {
00411   ink_assert(valid());
00412   url_nuke_proxy_stuff(m_url_impl);
00413 }
00414 
00415 /*-------------------------------------------------------------------------
00416   -------------------------------------------------------------------------*/
00417 
00418 inline int
00419 URL::print(char *buf, int bufsize, int *bufindex, int *dumpoffset)
00420 {
00421   ink_assert(valid());
00422   return url_print(m_url_impl, buf, bufsize, bufindex, dumpoffset);
00423 }
00424 
00425 /*-------------------------------------------------------------------------
00426   -------------------------------------------------------------------------*/
00427 
00428 inline int
00429 URL::length_get()
00430 {
00431   ink_assert(valid());
00432   return url_length_get(m_url_impl);
00433 }
00434 
00435 /*-------------------------------------------------------------------------
00436   -------------------------------------------------------------------------*/
00437 
00438 inline char *
00439 URL::string_get(Arena *arena_or_null_for_malloc, int *length)
00440 {
00441   ink_assert(valid());
00442   return url_string_get(m_url_impl, arena_or_null_for_malloc, length, m_heap);
00443 }
00444 
00445 inline char *
00446 URL::string_get_ref(int *length)
00447 {
00448   ink_assert(valid());
00449   return url_string_get_ref(m_heap, m_url_impl, length);
00450 }
00451 
00452 inline void
00453 URL::clear_string_ref()
00454 {
00455   ink_assert(valid());
00456   url_clear_string_ref(m_url_impl);
00457   return;
00458 }
00459 
00460 /*-------------------------------------------------------------------------
00461   -------------------------------------------------------------------------*/
00462 inline char *
00463 URL::string_get_buf(char *dstbuf, int dsbuf_size, int *length)
00464 {
00465   ink_assert(valid());
00466   return url_string_get_buf(m_url_impl, dstbuf, dsbuf_size, length);
00467 }
00468 
00469 /*-------------------------------------------------------------------------
00470   -------------------------------------------------------------------------*/
00471 
00472 inline void
00473 URL::hash_get(CryptoHash *md5)
00474 {
00475   ink_assert(valid());
00476   url_MD5_get(m_url_impl, md5);
00477 }
00478 
00479 /*-------------------------------------------------------------------------
00480   -------------------------------------------------------------------------*/
00481 
00482 inline void
00483 URL::host_hash_get(CryptoHash *md5)
00484 {
00485   ink_assert(valid());
00486   url_host_MD5_get(m_url_impl, md5);
00487 }
00488 
00489 /*-------------------------------------------------------------------------
00490   -------------------------------------------------------------------------*/
00491 
00492 inline const char *
00493 URL::scheme_get(int *length)
00494 {
00495   ink_assert(valid());
00496   return (url_scheme_get(m_url_impl, length));
00497 }
00498 
00499 
00500 inline int
00501 URL::scheme_get_wksidx()
00502 {
00503   ink_assert(valid());
00504   return (m_url_impl->m_scheme_wks_idx);
00505 }
00506 
00507 /*-------------------------------------------------------------------------
00508   -------------------------------------------------------------------------*/
00509 
00510 inline void
00511 URL::scheme_set(const char *value, int length)
00512 {
00513   ink_assert(valid());
00514   int scheme_wks_idx = (value ? hdrtoken_tokenize(value, length) : -1);
00515   url_scheme_set(m_heap, m_url_impl, value, scheme_wks_idx, length, true);
00516 }
00517 
00518 /*-------------------------------------------------------------------------
00519   -------------------------------------------------------------------------*/
00520 
00521 inline const char *
00522 URL::user_get(int *length)
00523 {
00524   ink_assert(valid());
00525   *length = m_url_impl->m_len_user;
00526   return m_url_impl->m_ptr_user;
00527 }
00528 
00529 /*-------------------------------------------------------------------------
00530   -------------------------------------------------------------------------*/
00531 
00532 inline void
00533 URL::user_set(const char *value, int length)
00534 {
00535   ink_assert(valid());
00536   url_user_set(m_heap, m_url_impl, value, length, true);
00537 }
00538 
00539 /*-------------------------------------------------------------------------
00540   -------------------------------------------------------------------------*/
00541 
00542 inline const char *
00543 URL::password_get(int *length)
00544 {
00545   ink_assert(valid());
00546   *length = m_url_impl->m_len_password;
00547   return m_url_impl->m_ptr_password;
00548 }
00549 
00550 /*-------------------------------------------------------------------------
00551   -------------------------------------------------------------------------*/
00552 
00553 inline void
00554 URL::password_set(const char *value, int length)
00555 {
00556   ink_assert(valid());
00557   url_password_set(m_heap, m_url_impl, value, length, true);
00558 }
00559 
00560 /*-------------------------------------------------------------------------
00561   -------------------------------------------------------------------------*/
00562 
00563 inline const char *
00564 URL::host_get(int *length)
00565 {
00566   ink_assert(valid());
00567   *length = m_url_impl->m_len_host;
00568   return m_url_impl->m_ptr_host;
00569 }
00570 
00571 /*-------------------------------------------------------------------------
00572   -------------------------------------------------------------------------*/
00573 
00574 inline void
00575 URL::host_set(const char *value, int length)
00576 {
00577   ink_assert(valid());
00578   url_host_set(m_heap, m_url_impl, value, length, true);
00579 }
00580 
00581 /*-------------------------------------------------------------------------
00582   -------------------------------------------------------------------------*/
00583 
00584 inline int
00585 URL::port_get()
00586 {
00587   ink_assert(valid());
00588   return url_canonicalize_port(m_url_impl->m_url_type, m_url_impl->m_port);
00589 }
00590 
00591 /*-------------------------------------------------------------------------
00592   -------------------------------------------------------------------------*/
00593 
00594 inline int
00595 URL::port_get_raw()
00596 {
00597   ink_assert(valid());
00598   return m_url_impl->m_port;
00599 }
00600 
00601 /*-------------------------------------------------------------------------
00602   -------------------------------------------------------------------------*/
00603 
00604 inline void
00605 URL::port_set(int port)
00606 {
00607   ink_assert(valid());
00608   url_port_set(m_heap, m_url_impl, port);
00609 }
00610 
00611 /*-------------------------------------------------------------------------
00612   -------------------------------------------------------------------------*/
00613 
00614 inline const char *
00615 URL::path_get(int *length)
00616 {
00617   ink_assert(valid());
00618   *length = m_url_impl->m_len_path;
00619   return m_url_impl->m_ptr_path;
00620 }
00621 
00622 /*-------------------------------------------------------------------------
00623   -------------------------------------------------------------------------*/
00624 
00625 inline void
00626 URL::path_set(const char *value, int length)
00627 {
00628   ink_assert(valid());
00629   url_path_set(m_heap, m_url_impl, value, length, true);
00630 }
00631 
00632 /*-------------------------------------------------------------------------
00633   -------------------------------------------------------------------------*/
00634 
00635 inline int
00636 URL::type_get()
00637 {
00638   ink_assert(valid());
00639   return m_url_impl->m_type_code;
00640 }
00641 
00642 /*-------------------------------------------------------------------------
00643   -------------------------------------------------------------------------*/
00644 
00645 inline void
00646 URL::type_set(int type)
00647 {
00648   ink_assert(valid());
00649   url_type_set(m_url_impl, type);
00650 }
00651 
00652 /*-------------------------------------------------------------------------
00653   -------------------------------------------------------------------------*/
00654 
00655 inline const char *
00656 URL::params_get(int *length)
00657 {
00658   ink_assert(valid());
00659   *length = m_url_impl->m_len_params;
00660   return m_url_impl->m_ptr_params;
00661 }
00662 
00663 /*-------------------------------------------------------------------------
00664   -------------------------------------------------------------------------*/
00665 
00666 inline void
00667 URL::params_set(const char *value, int length)
00668 {
00669   ink_assert(valid());
00670   url_params_set(m_heap, m_url_impl, value, length, true);
00671 }
00672 
00673 /*-------------------------------------------------------------------------
00674   -------------------------------------------------------------------------*/
00675 
00676 inline const char *
00677 URL::query_get(int *length)
00678 {
00679   ink_assert(valid());
00680   *length = m_url_impl->m_len_query;
00681   return m_url_impl->m_ptr_query;
00682 }
00683 
00684 /*-------------------------------------------------------------------------
00685   -------------------------------------------------------------------------*/
00686 
00687 inline void
00688 URL::query_set(const char *value, int length)
00689 {
00690   ink_assert(valid());
00691   url_query_set(m_heap, m_url_impl, value, length, true);
00692 }
00693 
00694 /*-------------------------------------------------------------------------
00695   -------------------------------------------------------------------------*/
00696 
00697 inline const char *
00698 URL::fragment_get(int *length)
00699 {
00700   ink_assert(valid());
00701   *length = m_url_impl->m_len_fragment;
00702   return m_url_impl->m_ptr_fragment;
00703 }
00704 
00705 /*-------------------------------------------------------------------------
00706   -------------------------------------------------------------------------*/
00707 
00708 inline void
00709 URL::fragment_set(const char *value, int length)
00710 {
00711   ink_assert(valid());
00712   url_fragment_set(m_heap, m_url_impl, value, length, true);
00713 }
00714 
00715 /**
00716   Parser doesn't clear URL first, so if you parse over a non-clear URL,
00717   the resulting URL may contain some of the previous data.
00718 
00719  */
00720 inline MIMEParseResult
00721 URL::parse(const char **start, const char *end)
00722 {
00723   ink_assert(valid());
00724   return url_parse(m_heap, m_url_impl, start, end, true);
00725 }
00726 
00727 /**
00728   Parser doesn't clear URL first, so if you parse over a non-clear URL,
00729   the resulting URL may contain some of the previous data.
00730 
00731  */
00732 inline MIMEParseResult
00733 URL::parse(const char *str, int length)
00734 {
00735   ink_assert(valid());
00736   if (length < 0)
00737     length = (int) strlen(str);
00738   return parse(&str, str + length);
00739 }
00740 
00741 /**
00742   Parser doesn't clear URL first, so if you parse over a non-clear URL,
00743   the resulting URL may contain some of the previous data.
00744 
00745  */
00746 inline MIMEParseResult
00747 URL::parse_no_path_component_breakdown(const char *str, int length)
00748 {
00749   ink_assert(valid());
00750   if (length < 0)
00751     length = (int) strlen(str);
00752   ink_assert(valid());
00753   return url_parse_no_path_component_breakdown(m_heap, m_url_impl, &str, str + length, true);
00754 }
00755 
00756 /*-------------------------------------------------------------------------
00757   -------------------------------------------------------------------------*/
00758 
00759 inline char *
00760 URL::unescapify(Arena *arena, const char *str, int length)
00761 {
00762   return url_unescapify(arena, str, length);
00763 }
00764 
00765 #endif /* __URL_H__ */
00766 

Generated by  doxygen 1.7.1