Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 #include "HttpHeaderTokenizer.h"
00032 #include "ink_assert.h"
00033 #include <stdio.h>
00034 #include <stdlib.h>
00035 #include <errno.h>
00036 #include <ctype.h>
00037 #include <memory.h>
00038 #include <assert.h>
00039 #include <string.h>
00040 #include <strings.h>
00041 #include <unistd.h>
00042 #include <stdarg.h>
00043 #include <libgen.h>
00044 #include <limits.h>
00045 #include <fcntl.h>
00046 #include <time.h>
00047 #include <sys/param.h>
00048 #include <sys/stat.h>
00049 
00050 static void
00051 add_field(HttpHeader * h, const char *name, const char *value)
00052 {
00053   h->m_header_fields.set_raw_header_field(name, value);
00054 }
00055 
00056 
00057 
00058 
00059 
00060 
00061 static void
00062 test_add_fields(HttpHeader * h)
00063 {
00064   char long_accept_header[2048];
00065   memset(long_accept_header, 'B', sizeof(long_accept_header));
00066   long_accept_header[sizeof(long_accept_header) - 1] = '\0';
00067   add_field(h, "Accept", long_accept_header);
00068   add_field(h, "Accept", "image/gif");
00069   add_field(h, "Accept", "image/x-xbitmap");
00070   add_field(h, "Accept", "image/jpeg");
00071   add_field(h, "Accept", "image/pjpeg");
00072   add_field(h, "Accept", "*/*");
00073   add_field(h, "Set-Cookie", "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
00074   add_field(h, "Set-Cookie", "1234567890987654321");
00075   return;
00076 }
00077 
00078 
00079 
00080 
00081 
00082 
00083 static void
00084 test_hacked_http_header_field()
00085 {
00086   HttpHackedMultiValueRawHeaderField f;
00087 
00088 #define ADD_FIELD(s) f.add(s, sizeof(s))
00089   ADD_FIELD("image/gif");
00090   ADD_FIELD("image/x-xbitmap");
00091   ADD_FIELD("image/jpeg");
00092   ADD_FIELD("image/pjpeg");
00093   ADD_FIELD("*/*");
00094 #undef ADD_FIELD
00095 
00096   int count = f.get_count();
00097   cout << "count = " << count << endl;
00098   int length = 0;
00099   for (int i = 0; i < count; i++) {
00100     cout << "Accept: " << f.get(i, &length) << endl;
00101     cout << "(length = " << length << ")" << endl;
00102   }
00103   return;
00104 }
00105 
00106 
00107 
00108 
00109 
00110 
00111 void
00112 test_url_parse(const char *url_string)
00113 {
00114   URL url(url_string, strlen(url_string));
00115   char buf[4096];
00116 
00117   url.dump(buf, sizeof(buf));
00118 
00119   cout << buf << endl;
00120 
00121   return;
00122 }
00123 
00124 
00125 
00126 
00127 
00128 
00129 void
00130 test_url()
00131 {
00132   test_url_parse("http://charm.example.com  ");
00133   test_url_parse
00134     ("http://webchat16.wbs.net:6666?private=herbalessences&color=4&volume=0&tagline=&picture=&home_page=hi@there.&ignore=edheldinruth+taz0069+speezman&back=&Room=Hot_Tub&handle=cagou67&mu=893e159ef7fe0ddb022c655cc1c30abd33d4ae6d90d22f8a&last_read_para=&npo=&fsection=input&chatmode=push&reqtype=input&InputText=Sweetie%2C+do+you+have+time+to+go+to+a+private+room..if+not+I%27m+just+going+to+have+to+change+to+normal+mode...let+me+know%3F%3F/");
00135 
00136   return;
00137 }
00138 
00139 
00140 
00141 
00142 
00143 
00144 
00145 void
00146 test_header_tokenizer_run(const char *buf, HttpMessageType_t message_type)
00147 {
00148   HttpHeaderTokenizer tokenizer;
00149   HttpHeader header;
00150   int bytes_used;
00151 
00152   tokenizer.start(&header, message_type, false);
00153 
00154   tokenizer.run(buf, strlen(buf), true, &bytes_used);
00155 
00156   cout << header << endl;
00157 
00158   return;
00159 }
00160 
00161 void
00162 test_header_tokenizer()
00163 {
00164   test_header_tokenizer_run
00165     ("GET http://webchat16.wbs.net:6666?private=herbalessences&color=4&volume=0&tagline=&picture=&home_page=hi@there.&ignore=edheldinruth+taz0069+speezman&back=&Room=Hot_Tub&handle=cagou67&mu=893e159ef7fe0ddb022c655cc1c30abd33d4ae6d90d22f8a&last_read_para=&npo=&fsection=input&chatmode=push&reqtype=input&InputText=Sweetie%2C+do+you+have+time+to+go+to+a+private+room..if+not+I%27m+just+going+to+have+to+change+to+normal+mode...let+me+know%3F%3F/ HTTP/1.0\r\n",
00166      HTTP_MESSAGE_TYPE_REQUEST);
00167 
00168   return;
00169 }
00170 
00171 
00172 
00173 
00174 
00175 
00176 void
00177 TestHttpHeader()
00178 {
00179   HttpHeader h;
00180   h.m_message_type = HTTP_MESSAGE_TYPE_REQUEST;
00181   h.m_method = HTTP_METHOD_GET;
00182   h.m_version = HttpVersion(1, 0);
00183 
00184   test_add_fields(&h);
00185 
00186   cout << h << endl;
00187 
00188   cout << "concatenated accept" << endl;
00189   char accept_buf[4000];
00190   h.m_header_fields.get_comma_separated_accept_value(accept_buf, sizeof(accept_buf));
00191   cout << accept_buf << endl;
00192 
00193   int l;
00194   cout << "first accept" << endl;
00195   cout << h.m_header_fields.m_accept.get(0, &l) << endl;
00196 
00197 
00198   char buf[4096];
00199   int marshal_length = h.marshal(buf, sizeof(buf));
00200 
00201   HttpHeader h1;
00202   h1.unmarshal(buf, marshal_length);
00203 
00204   cout << "unmarshalled: " << endl;
00205   cout << h1 << endl;
00206 
00207   cout << "test url parser:" << endl;
00208   test_url();
00209 
00210   cout << "test_header_tokenizer:" << endl;
00211   test_header_tokenizer();
00212 
00213   return;
00214 }