00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #include "Regression.h"
00025 #include "HttpTransact.h"
00026 #include "HttpSM.h"
00027 
00028 void forceLinkRegressionHttpTransact()
00029 {
00030 }
00031 
00032 static void
00033 init_sm(HttpSM *sm)
00034 {
00035 
00036   sm->init();
00037   sm->t_state.hdr_info.client_request.create(HTTP_TYPE_REQUEST, NULL);
00038 
00039 }
00040 
00041 static void
00042 setup_client_request(HttpSM * sm, const char * scheme, const char * request)
00043 {
00044   init_sm(sm);
00045 
00046   MIOBuffer * read_buffer = new_MIOBuffer(HTTP_HEADER_BUFFER_SIZE_INDEX);
00047   IOBufferReader * buffer_reader = read_buffer->alloc_reader();
00048   read_buffer->write(request, strlen(request));
00049 
00050   HTTPParser httpParser;
00051   http_parser_init(&httpParser);
00052   int bytes_used = 0;
00053   sm->t_state.hdr_info.client_request.parse_req(&httpParser, buffer_reader, &bytes_used, true );
00054   sm->t_state.hdr_info.client_request.url_get()->scheme_set(scheme, strlen(scheme));
00055   free_MIOBuffer(read_buffer);
00056 }
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 REGRESSION_TEST(HttpTransact_is_request_valid)(RegressionTest *t, int , int *pstatus)
00066 {
00067   HttpTransact transaction;
00068   HttpSM sm;
00069   *pstatus = REGRESSION_TEST_PASSED;
00070 
00071   struct
00072   {
00073     const char *scheme;
00074     const char *req;
00075     bool result;
00076   } requests[] = {
00077     
00078     { "http", "GET / HTTP/1.1\r\n\r\n", false},
00079     
00080     { "http", "GET / HTTP/1.1\r\nHost: abc.com\r\n\r\n", true},
00081     
00082     { "http", "POST / HTTP/1.1\r\nHost: abc.com\r\nContent-Length: -1\r\n\r\n", false},
00083     { "http", "PUSH / HTTP/1.1\r\nHost: abc.com\r\nContent-Length: -1\r\n\r\n", false},
00084     { "http", "PUT / HTTP/1.1\r\nHost: abc.com\r\nContent-Length: -1\r\n\r\n", false},
00085     
00086     { "http", "POST / HTTP/1.1\r\nHost: abc.com\r\nContent-Length: 10\r\n\r\n", true},
00087     { "http", "PUSH / HTTP/1.1\r\nHost: abc.com\r\nContent-Length: 10\r\n\r\n", true},
00088     { "http", "PUT / HTTP/1.1\r\nHost: abc.com\r\nContent-Length: 10\r\n\r\n", true},
00089     
00090     { "http", "POST / HTTP/1.1\r\nHost: abc.com\r\n\r\n", false},
00091     { "http", "PUSH / HTTP/1.1\r\nHost: abc.com\r\n\r\n", false},
00092     { "http", "PUT / HTTP/1.1\r\nHost: abc.com\r\n\r\n", false},
00093     { NULL, NULL, false}
00094   };
00095   for (int i = 0; requests[i].req; i++) {
00096     setup_client_request(&sm, requests[i].scheme, requests[i].req);
00097 
00098     if (requests[i].result != transaction.is_request_valid(&sm.t_state, &sm.t_state.hdr_info.client_request)) {
00099       rprintf(t, "HttpTransact::is_request_valid - failed for request = '%s'.  Expected result was %s request\n", requests[i].req,(requests[i].result ? "valid" :"invalid") );
00100       *pstatus = REGRESSION_TEST_FAILED;
00101     }
00102   }
00103 }