Diff for /parser3/src/main/pa_http.C between versions 1.57 and 1.64

version 1.57, 2013/03/11 05:51:17 version 1.64, 2015/04/06 22:27:26
Line 15 Line 15
   
 volatile const char * IDENT_PA_HTTP_C="$Id$" IDENT_PA_HTTP_H;   volatile const char * IDENT_PA_HTTP_C="$Id$" IDENT_PA_HTTP_H; 
   
   #ifdef _MSC_VER
   #include <windows.h>
   #else
   #define closesocket close
   #endif
   
 // defines  // defines
   
 #define HTTP_METHOD_NAME        "method"  #define HTTP_METHOD_NAME        "method"
Line 24  volatile const char * IDENT_PA_HTTP_C="$ Line 30  volatile const char * IDENT_PA_HTTP_C="$
 #define HTTP_HEADERS_NAME       "headers"  #define HTTP_HEADERS_NAME       "headers"
 #define HTTP_FORM_ENCTYPE_NAME  "enctype"  #define HTTP_FORM_ENCTYPE_NAME  "enctype"
 #define HTTP_ANY_STATUS_NAME    "any-status"  #define HTTP_ANY_STATUS_NAME    "any-status"
 #define HTTP_OMIT_POST_CHARSET_NAME     "omit-post-charset"     // ^file::load[...;http://...;$.form[...]$.method[post]]  #define HTTP_OMIT_POST_CHARSET_NAME     "omit-post-charset"     // ^file::load[...;http://...;$.method[post]] by default adds charset to content-type
                                                                                                         // by default add charset to content-type  
   
 #define HTTP_TABLES_NAME "tables"  #define HTTP_TABLES_NAME "tables"
   
Line 34  volatile const char * IDENT_PA_HTTP_C="$ Line 39  volatile const char * IDENT_PA_HTTP_C="$
   
 #define DEFAULT_USER_AGENT "parser3"  #define DEFAULT_USER_AGENT "parser3"
   
 #       ifndef INADDR_NONE  #ifndef INADDR_NONE
 #               define INADDR_NONE ((ulong) -1)  #define INADDR_NONE ((ulong) -1)
 #       endif  #endif
   
 #undef CRLF  #undef CRLF
 #define CRLF "\r\n"  #define CRLF "\r\n"
Line 342  static void http_pass_header(HashStringV Line 347  static void http_pass_header(HashStringV
                 *info->user_agent_specified=true;                  *info->user_agent_specified=true;
         if(strcasecmp(name_cstr, HTTP_CONTENT_TYPE)==0){          if(strcasecmp(name_cstr, HTTP_CONTENT_TYPE)==0){
                 *info->content_type_specified=true;                  *info->content_type_specified=true;
                 *info->content_type_url_encoded=StrStartFromNC(value.cstr(), HTTP_CONTENT_TYPE_FORM_URLENCODED);                  *info->content_type_url_encoded=pa_strncasecmp(value.cstr(), HTTP_CONTENT_TYPE_FORM_URLENCODED)==0;
         }          }
 }  }
   
Line 405  static void form_value2string( Line 410  static void form_value2string(
         } else          } else
                 throw Exception(PARSER_RUNTIME,                  throw Exception(PARSER_RUNTIME,
                         new String(key, String::L_TAINTED),                          new String(key, String::L_TAINTED),
                         "is %s, "HTTP_FORM_NAME" option value can be string or table only (file is allowed for $."HTTP_METHOD_NAME"[POST] + $."HTTP_FORM_ENCTYPE_NAME"["HTTP_CONTENT_TYPE_MULTIPART_FORMDATA"])", value->type());                          "is %s, " HTTP_FORM_NAME " option value can be string or table only (file is allowed for $." HTTP_METHOD_NAME "[POST] + $." HTTP_FORM_ENCTYPE_NAME "[" HTTP_CONTENT_TYPE_MULTIPART_FORMDATA "])", value->type());
 }  }
   
 const char* pa_form2string(HashStringValue& form, Request_charsets& charsets) {  const char* pa_form2string(HashStringValue& form, Request_charsets& charsets) {
Line 511  static void form_value2part( Line 516  static void form_value2part(
         } else          } else
                 throw Exception(PARSER_RUNTIME,                  throw Exception(PARSER_RUNTIME,
                         new String(key, String::L_TAINTED),                          new String(key, String::L_TAINTED),
                         "is %s, "HTTP_FORM_NAME" option value can be string, table or file only", value->type());                          "is %s, " HTTP_FORM_NAME " option value can be string, table or file only", value->type());
 }  }
   
 const char* pa_form2string_multipart(HashStringValue& form, Request& r, const char* boundary, size_t& post_size){  const char* pa_form2string_multipart(HashStringValue& form, Request& r, const char* boundary, size_t& post_size){
Line 543  static void find_headers_end(char* p, Line 548  static void find_headers_end(char* p,
   
 // Set-Cookie: name=value; Domain=docs.foo.com; Path=/accounts; Expires=Wed, 13-Jan-2021 22:23:01 GMT; Secure; HttpOnly  // Set-Cookie: name=value; Domain=docs.foo.com; Path=/accounts; Expires=Wed, 13-Jan-2021 22:23:01 GMT; Secure; HttpOnly
 static ArrayString* parse_cookie(Request& r, const String& cookie) {  static ArrayString* parse_cookie(Request& r, const String& cookie) {
         char *current=strdup(cookie.cstr());          char *current=pa_strdup(cookie.cstr());
                   
         const String* name=0;          const String* name=0;
         const String* value=&String::Empty;          const String* value=&String::Empty;
Line 637  File_read_http_result pa_internal_file_r Line 642  File_read_http_result pa_internal_file_r
         Value* vcookies=0;          Value* vcookies=0;
         Value* vbody=0;          Value* vbody=0;
         Charset *asked_remote_charset=0;          Charset *asked_remote_charset=0;
           Charset* real_remote_charset=0;
         const char* user_cstr=0;          const char* user_cstr=0;
         const char* password_cstr=0;          const char* password_cstr=0;
         const char* encode=0;          const char* encode=0;
Line 680  File_read_http_result pa_internal_file_r Line 686  File_read_http_result pa_internal_file_r
                         omit_post_charset=vomit_post_charset->as_bool();                          omit_post_charset=vomit_post_charset->as_bool();
                 }                  }
                 if(Value* vcharset_name=options->get(PA_CHARSET_NAME)) {                  if(Value* vcharset_name=options->get(PA_CHARSET_NAME)) {
                         asked_remote_charset=&charsets.get(vcharset_name->as_string().                          asked_remote_charset=&charsets.get(vcharset_name->as_string().change_case(r.charsets.source(), String::CC_UPPER));
                                 change_case(r.charsets.source(), String::CC_UPPER));                  } 
                   if(Value* vresponse_charset_name=options->get(PA_RESPONSE_CHARSET_NAME)) {
                           valid_options++;
                           real_remote_charset=&charsets.get(vresponse_charset_name->as_string().change_case(r.charsets.source(), String::CC_UPPER));
                 }                   } 
                 if(Value* vuser=options->get(HTTP_USER)) {                  if(Value* vuser=options->get(HTTP_USER)) {
                         valid_options++;                          valid_options++;
Line 702  File_read_http_result pa_internal_file_r Line 711  File_read_http_result pa_internal_file_r
                 if(method_is_get)                  if(method_is_get)
                         throw Exception(PARSER_RUNTIME,                          throw Exception(PARSER_RUNTIME,
                                 0,                                  0,
                                 "you can not use $."HTTP_FORM_ENCTYPE_NAME" option with method GET");                                  "you can not use $." HTTP_FORM_ENCTYPE_NAME " option with method GET");
   
                 multipart=strcasecmp(encode, HTTP_CONTENT_TYPE_MULTIPART_FORMDATA)==0;                  multipart=strcasecmp(encode, HTTP_CONTENT_TYPE_MULTIPART_FORMDATA)==0;
   
                 if(!multipart && strcasecmp(encode, HTTP_CONTENT_TYPE_FORM_URLENCODED)!=0)                  if(!multipart && strcasecmp(encode, HTTP_CONTENT_TYPE_FORM_URLENCODED)!=0)
                         throw Exception(PARSER_RUNTIME,                          throw Exception(PARSER_RUNTIME,
                                 0,                                  0,
                                 "$."HTTP_FORM_ENCTYPE_NAME" option value can be "HTTP_CONTENT_TYPE_FORM_URLENCODED" or "HTTP_CONTENT_TYPE_MULTIPART_FORMDATA" only");                                  "$." HTTP_FORM_ENCTYPE_NAME " option value can be " HTTP_CONTENT_TYPE_FORM_URLENCODED " or " HTTP_CONTENT_TYPE_MULTIPART_FORMDATA " only");
         }          }
   
         if(vbody){          if(vbody){
                 if(method_is_get)                  if(method_is_get)
                         throw Exception(PARSER_RUNTIME,                          throw Exception(PARSER_RUNTIME,
                                 0,                                  0,
                                 "you can not use $."HTTP_BODY_NAME" option with method GET");                                  "you can not use $." HTTP_BODY_NAME " option with method GET");
   
                 if(form)                  if(form)
                         throw Exception(PARSER_RUNTIME,                          throw Exception(PARSER_RUNTIME,
                                 0,                                  0,
                                 "you can not use options $."HTTP_BODY_NAME" and $."HTTP_FORM_NAME" together");                                  "you can not use options $." HTTP_BODY_NAME " and $." HTTP_FORM_NAME " together");
         }          }
   
         //preparing request          //preparing request
Line 895  File_read_http_result pa_internal_file_r Line 904  File_read_http_result pa_internal_file_r
         result.headers=new HashStringValue;          result.headers=new HashStringValue;
         VHash* vtables=new VHash;          VHash* vtables=new VHash;
         result.headers->put(HTTP_TABLES_NAME, vtables);          result.headers->put(HTTP_TABLES_NAME, vtables);
         Charset* real_remote_charset=0; // undetected, yet  
   
         if(headers_end_at) {          if(headers_end_at) {
                 *headers_end_at=0;                  *headers_end_at=0;
Line 918  File_read_http_result pa_internal_file_r Line 926  File_read_http_result pa_internal_file_r
                                         "bad response from host - bad header \"%s\"", line.cstr());                                          "bad response from host - bad header \"%s\"", line.cstr());
                         const String::Body HEADER_NAME=line.mid(0, pos).change_case(r.charsets.source(), String::CC_UPPER);                          const String::Body HEADER_NAME=line.mid(0, pos).change_case(r.charsets.source(), String::CC_UPPER);
                         const String& HEADER_VALUE=line.mid(pos+1, line.length()).trim(String::TRIM_BOTH, " \t\r");                          const String& HEADER_VALUE=line.mid(pos+1, line.length()).trim(String::TRIM_BOTH, " \t\r");
                         if(as_text && HEADER_NAME==HTTP_CONTENT_TYPE_UPPER)                          if(as_text && HEADER_NAME==HTTP_CONTENT_TYPE_UPPER && !real_remote_charset)
                                 real_remote_charset=detect_charset(HEADER_VALUE.cstr());                                  real_remote_charset=detect_charset(HEADER_VALUE.cstr());
   
                         // tables                          // tables

Removed from v.1.57  
changed lines
  Added in v.1.64


E-mail: