PRIVATE void parseCookiesFromURL(rss_feed* feed) { const char* result_regex = ":COOKIE:(.+)"; assert(feed && feed->url && *feed->url); feed->cookies = getRegExMatch(result_regex, feed->url, 1); }
PRIVATE size_t write_header_callback(void *ptr, size_t size, size_t nmemb, void *data) { size_t line_len = size * nmemb; WebData *mem = (WebData*)data; const char *line = (const char*)ptr; char *tmp = NULL; char *filename = NULL; const char *content_pattern = "Content-Disposition:\\s(inline|attachment);\\s+filename=\"?(.+?)\"?;?\\r?\\n?$"; int content_length = 0; static uint8_t isMoveHeader = 0; /* check the header if it is a redirection header */ if(line_len >= 9 && !memcmp(line, "Location:", 9)) { isMoveHeader = 1; if(mem->response->data != NULL) { am_free(mem->response->data); mem->response->data = NULL; mem->response->buffer_size = 0; mem->content_length = 0; } } else if(line_len >= 15 && !memcmp(line, "Content-Length:", 15)) { /* parse header for Content-Length to allocate correct size for data->response->data */ tmp = getRegExMatch("Content-Length:\\s(\\d+)", line, 1); if(tmp != NULL) { dbg_printf(P_INFO2, "Content-Length: %s", tmp); content_length = atoi(tmp); if(content_length > 0 && !isMoveHeader) { mem->content_length = content_length; mem->response->buffer_size = content_length + 1; mem->response->data = am_realloc(mem->response->data, mem->response->buffer_size); } am_free(tmp); } } else if(line_len >= 19 && !memcmp(line, "Content-Disposition", 19)) { /* parse header for Content-Disposition to get correct filename */ filename = getRegExMatch(content_pattern, line, 2); if(filename) { mem->content_filename = filename; dbg_printf(P_INFO2, "[write_header_callback] Found filename: %s", mem->content_filename); } } else if(line_len >= 2 && !memcmp(line, "\r\n", 2)) { /* We're at the end of a header, reaset the relocation flag */ isMoveHeader = 0; } return line_len; }
torrent_id_t parseTorrentID(const char* response) { const char* result_regex = "\"id\":\\s*(\\d+)"; char *result_str = NULL; torrent_id_t id = -1; result_str = getRegExMatch(result_regex, response, 1); if(result_str) { id = atoi(result_str); am_free(result_str); } return id; }
int8_t parseRPCVersion(const char* response) { const char* result_regex = "\"rpc-version\":\\s*(\\d+)"; char *result_str = NULL; int8_t result = -1; result_str = getRegExMatch(result_regex, response, 1); if(result_str) { result = atoi(result_str); am_free(result_str); } return result; }
PRIVATE size_t parse_Transmission_response(void *ptr, size_t size, size_t nmemb, void *data) { size_t line_len = size * nmemb; const char *line = ptr; WebData *mem = data; const char *session_key = "X-Transmission-Session-Id: "; const size_t key_len = strlen( session_key ); char *tmp = NULL; int content_length = 0; if( (line_len >= key_len) && !memcmp(line, session_key, key_len) ) { const char * begin = line + key_len; const char * end = begin; while( !isspace( *end ) ) { ++end; } am_free( gSessionID ); gSessionID = NULL; gSessionID = am_strndup( begin, end-begin ); /* parse header for Content-Length to allocate correct size for data->response->data */ } else if(line_len >= 15 && !memcmp(line, "Content-Length:", 15)) { tmp = getRegExMatch("Content-Length:\\s(\\d+)", line, 1); if(tmp != NULL) { dbg_printf(P_INFO2, "Content-Length: %s", tmp); content_length = atoi(tmp); if(content_length > 0) { mem->content_length = content_length; mem->response->buffer_size = content_length + 1; mem->response->data = am_realloc(mem->response->data, mem->response->buffer_size); } am_free(tmp); } } return line_len; }
char* parseResponse(const char* response) { const char* result_regex = "\"result\":\\s*\"(.+)\""; return getRegExMatch(result_regex, response, 1); }
int testGetMatch(void) { const char* pattern1 = "Content-Disposition:\\s(inline|attachment);\\s*filename=\"?(.+?)\"?;?\\r?\\n?$"; const char* pattern2 = "\"result\":\\s\"(.+)\"\n"; const char* string1 = "Content-Disposition: inline; filename=\"this.is.a.test-file.torrent\""; const char* string2 = "Content-Disposition: inline; filename=this.is.a.test-file.torrent"; const char* string3 = "\"result\": \"success\""; char *res_str = NULL; res_str = getRegExMatch(NULL, NULL, 0); check(res_str == NULL); res_str = getRegExMatch(pattern1, NULL, 0); check(res_str == NULL); res_str = getRegExMatch(NULL, string1, 0); check(res_str == NULL); res_str = getRegExMatch(pattern1, string1, 7); check(res_str == NULL); res_str = getRegExMatch(pattern1, string1, 2); check(strcmp(res_str, "this.is.a.test-file.torrent") == 0); am_free(res_str); res_str = getRegExMatch(pattern1, string2, 2); check(strcmp(res_str, "this.is.a.test-file.torrent") == 0); am_free(res_str); res_str = getRegExMatch(pattern1, string3, 2); check(res_str == NULL); am_free(res_str); res_str = getRegExMatch(pattern2, string3, 2); check(res_str == NULL); am_free(res_str); res_str = getRegExMatch(pattern2, string3, 1); check(strcmp(res_str, "success") == 0); am_free(res_str); res_str = getRegExMatch(pattern2, "\"result\": \"failure\"", 1); check(strcmp(res_str, "failure") == 0); am_free(res_str); res_str = getRegExMatch(pattern2, "\"result\": \"duplicate torrent\"", 1); check(strcmp(res_str, "duplicate torrent") == 0); am_free(res_str); return 0; }