Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
char* parseResponse(const char* response) {
	const char* result_regex = "\"result\":\\s*\"(.+)\"";
	return getRegExMatch(result_regex, response, 1);
}
Ejemplo n.º 7
0
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;
}