diff options
Diffstat (limited to 'src/Wallabag')
-rw-r--r-- | src/Wallabag/CoreBundle/Helper/ContentProxy.php | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/src/Wallabag/CoreBundle/Helper/ContentProxy.php b/src/Wallabag/CoreBundle/Helper/ContentProxy.php index da0ec5a3..007ee8bb 100644 --- a/src/Wallabag/CoreBundle/Helper/ContentProxy.php +++ b/src/Wallabag/CoreBundle/Helper/ContentProxy.php | |||
@@ -246,15 +246,7 @@ class ContentProxy | |||
246 | */ | 246 | */ |
247 | private function stockEntry(Entry $entry, array $content) | 247 | private function stockEntry(Entry $entry, array $content) |
248 | { | 248 | { |
249 | // When a redirection occurs while fetching an entry | 249 | $this->updateOriginUrl($entry, $content['url']); |
250 | // we move the original url in origin_url property if empty | ||
251 | // and set the entry url with the final value | ||
252 | if (!empty($content['url']) && $entry->getUrl() !== $content['url']) { | ||
253 | if (empty($entry->getOriginUrl())) { | ||
254 | $entry->setOriginUrl($entry->getUrl()); | ||
255 | } | ||
256 | $entry->setUrl($content['url']); | ||
257 | } | ||
258 | 250 | ||
259 | $this->setEntryDomainName($entry); | 251 | $this->setEntryDomainName($entry); |
260 | 252 | ||
@@ -321,6 +313,50 @@ class ContentProxy | |||
321 | } | 313 | } |
322 | 314 | ||
323 | /** | 315 | /** |
316 | * Update the origin_url field when a redirection occurs | ||
317 | * This field is set if it is empty and new url does not match ignore list. | ||
318 | * | ||
319 | * @param Entry $entry | ||
320 | * @param string $url | ||
321 | */ | ||
322 | private function updateOriginUrl(Entry $entry, $url) | ||
323 | { | ||
324 | if (!empty($url) && $entry->getUrl() !== $url) { | ||
325 | $parsed_entry_url = parse_url($entry->getUrl()); | ||
326 | $parsed_content_url = parse_url($url); | ||
327 | |||
328 | $diff_ec = array_diff_assoc($parsed_entry_url, $parsed_content_url); | ||
329 | $diff_ce = array_diff_assoc($parsed_content_url, $parsed_entry_url); | ||
330 | |||
331 | $diff = array_merge($diff_ec, $diff_ce); | ||
332 | $diff_keys = array_keys($diff); | ||
333 | sort($diff_keys); | ||
334 | |||
335 | switch ($diff_keys) { | ||
336 | case ['path']: | ||
337 | if (($parsed_entry_url['path'] . '/' === $parsed_content_url['path']) // diff is trailing slash, we only replace the url of the entry | ||
338 | || ($url === urldecode($entry->getUrl()))) { // we update entry url if new url is a decoded version of it, see EntryRepository#findByUrlAndUserId | ||
339 | $entry->setUrl($url); | ||
340 | } | ||
341 | break; | ||
342 | case ['scheme']: | ||
343 | $entry->setUrl($url); | ||
344 | break; | ||
345 | case ['fragment']: | ||
346 | case ['query']: | ||
347 | // noop | ||
348 | break; | ||
349 | default: | ||
350 | if (empty($entry->getOriginUrl())) { | ||
351 | $entry->setOriginUrl($entry->getUrl()); | ||
352 | } | ||
353 | $entry->setUrl($url); | ||
354 | break; | ||
355 | } | ||
356 | } | ||
357 | } | ||
358 | |||
359 | /** | ||
324 | * Validate that the given content has at least a title, an html and a url. | 360 | * Validate that the given content has at least a title, an html and a url. |
325 | * | 361 | * |
326 | * @param array $content | 362 | * @param array $content |