--- parser3/src/main/pa_common.C 2003/02/03 15:57:44 1.143.2.12 +++ parser3/src/main/pa_common.C 2003/02/14 17:28:19 1.143.2.18 @@ -5,15 +5,14 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_COMMON_C="$Date: 2003/02/03 15:57:44 $"; +static const char* IDENT_COMMON_C="$Date: 2003/02/14 17:28:19 $"; -//#include "pa_value_includes.h" #include "pa_common.h" #include "pa_exception.h" -#include "pa_value_includes.h" #include "pa_hash.h" #include "pa_vstring.h" #include "pa_vint.h" +#include "pa_globals.h" #ifdef CYGWIN #define _GNU_H_WINDOWS32_SOCKETS @@ -94,8 +93,33 @@ static int unlock(int fd) { FLOCK(F_TLOC #endif #endif +// defines for globals + +#define FILE_STATUS_NAME "status" + +// globals + +StringPtr file_status_name(new String(FILE_STATUS_NAME)); + +// defines for statics + +#define HTTP_METHOD_NAME "method" +#define HTTP_TIMEOUT_NAME "timeout" +#define HTTP_HEADERS_NAME "headers" +#define HTTP_ANY_STATUS_NAME "any-status" + +// statics + +static StringPtr http_method_name(new String(HTTP_METHOD_NAME)); +static StringPtr http_timeout_name(new String(HTTP_TIMEOUT_NAME)); +static StringPtr http_headers_name(new String(HTTP_HEADERS_NAME)); +static StringPtr http_any_status_name(new String(HTTP_ANY_STATUS_NAME)); + +// defines + #define DEFAULT_USER_AGENT "parser3" +// functions void fix_line_breaks(char* buf, size_t& size) { if(size==0) @@ -128,10 +152,10 @@ void fix_line_breaks(char* buf, size_t& char* file_read_text(Pool& pool, Charset& charset, StringPtr file_spec, bool fail_on_read_problem, - HashStringValue *params, HashStringValue** out_fields) { - char *result; size_t size; - File_read_result file_read_result=file_read(pool, charset, file_spec, result, size, true, params, out_fields, fail_on_read_problem); - return file_read_result.success?result:0; + HashStringValue* params/*, HashStringValuePtr* out_fields*/) { + File_read_result file= + file_read(pool, charset, file_spec, true, params, fail_on_read_problem); + return file.success?file.data:0; } //http request stuff @@ -162,7 +186,7 @@ static int http_read_response(Pool& pool response.APPEND_TAINTED(buf, size, "remote HTTP server response", 0); if(!result && (EOLat=response.pos("\r\n", 2))>=0) { // checking status in first response StringPtr status_line=response.mid(0, (size_t)EOLat); - Array astatus; + ArrayString astatus; status_line->split(astatus, 0, " ", 1); StringPtr status_code=astatus.get(1); result=status_code->as_int(); @@ -275,10 +299,15 @@ static void http_pass_header(HashStringV if(*key->change_case(*info->pool, *info->charset, String::CC_UPPER)=="USER-AGENT") info->user_agent_specified=true; } -static HashStringValuePtr file_read_http(Pool& pool, Charset& charset, StringPtr file_spec, - char*& data, size_t& data_size, - HashStringValue *options=0, bool return_outfields=false) { - HashStringValuePtr result(0); +#ifndef DOXYGEN +struct File_read_http_info { + char **data; size_t *data_size; + HashStringValuePtr headers; +}; +#endif +static File_read_http_info file_read_http(Pool& pool, Charset& charset, StringPtr file_spec, + HashStringValue *options=0) { + File_read_http_info result; char host[MAX_STRING]; const char* uri; int port; @@ -369,8 +398,8 @@ static HashStringValuePtr file_read_http StringPtr header_block=response.mid(0, pos); StringPtr body=response.mid(pos+4, response.size()); - Array aheaders; - HashStringValuePtr headers(new HashStringValue); + ArrayString aheaders; + result.headers=HashStringValuePtr(new HashStringValue); header_block->split(aheaders, 0, "\r\n", 2); //processing headers @@ -382,19 +411,16 @@ static HashStringValuePtr file_read_http connect_string, "bad response from host - bad header \"%s\"", line->cstr().get()); - headers->put( + result.headers->put( line->mid(0, pos)->change_case(pool, charset, String::CC_UPPER), ValuePtr(new VString(line->mid(pos+2, line->size())))); } // output response - data=new(pool) char[data_size=body->size()]; - body->store_to(data, String::UL_AS_IS); - if(return_outfields) { - headers->put(file_status_name, ValuePtr(new VInt(status_code))); - return headers; - } else - return HashStringValuePtr(0); + *result.data=new(pool) char[*result.data_size=body->size()]; + body->store_to(*result.data, String::UL_AS_IS); + result.headers->put(file_status_name, ValuePtr(new VInt(status_code))); + return result; } #ifndef DOXYGEN @@ -428,16 +454,15 @@ static void file_read_action(Pool& pool, } } File_read_result file_read(Pool& pool, Charset& charset, StringPtr file_spec, - char*& data, size_t& data_size, - bool as_text, HashStringValue *params, HashStringValue** out_fields, + bool as_text, HashStringValue *params, bool fail_on_read_problem) { File_read_result result; if(file_spec->starts_with("http://", 7)) { // fail on read problem - result.fields=file_read_http(pool, charset, file_spec, data, data_size, params); + result.headers=file_read_http(pool, charset, file_spec, params).headers; result.success=true; } else { - File_read_action_info info={&data, &data_size}; + File_read_action_info info={&result.data, &result.size}; result.success=file_read_action_under_lock(pool, file_spec, "read", file_read_action, &info, as_text, fail_on_read_problem); @@ -445,17 +470,17 @@ File_read_result file_read(Pool& pool, C if(result.success && as_text) { // UTF-8 signature: EF BB BF - if(data_size>=3) { - char *in=(char *)data; + if(result.size>=3) { + char *in=(char *)result.data; if((in[0] == '\xEF') && (in[1] == '\xBB') && (in[2] == '\xBF')) { - data=in+3; data_size-=3;// skip prefix + result.data=in+3; result.size-=3;// skip prefix } } - fix_line_breaks((char *)(data), data_size); + fix_line_breaks((char *)(result.data), result.size); // note: after fixing - ((char*&)(data))[data_size]=0; + ((char*&)(result.data))[result.size]=0; } return result; @@ -584,7 +609,7 @@ bool file_write_action_under_lock( #ifndef DOXYGEN struct File_write_action_info { - const void *data; size_t size; + const char *data; size_t size; }; #endif static void file_write_action(int f, void *context) { @@ -599,7 +624,7 @@ static void file_write_action(int f, voi } void file_write( StringPtr file_spec, - const void *data, size_t size, + const char *data, size_t size, bool as_text, bool do_append) { File_write_action_info info={data, size};