blob: 6c4ce2346057acacb908924380a9ef2d90445463 [file] [log] [blame]
/*
* Copyright 2013 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "net/instaweb/rewriter/public/decode_rewritten_urls_filter.h"
#include <memory>
#include "net/instaweb/http/public/log_record.h"
#include "net/instaweb/rewriter/public/resource_tag_scanner.h"
#include "net/instaweb/rewriter/public/rewrite_driver.h"
#include "net/instaweb/rewriter/public/rewrite_options.h"
#include "pagespeed/kernel/base/string_util.h"
#include "pagespeed/kernel/html/html_element.h"
#include "pagespeed/kernel/http/data_url.h"
#include "pagespeed/kernel/http/google_url.h"
#include "pagespeed/opt/logging/enums.pb.h"
namespace net_instaweb {
DecodeRewrittenUrlsFilter::~DecodeRewrittenUrlsFilter() {
}
void DecodeRewrittenUrlsFilter::StartElement(HtmlElement* element) {
resource_tag_scanner::UrlCategoryVector attributes;
resource_tag_scanner::ScanElement(element, driver_->options(), &attributes);
for (int i = 0, n = attributes.size(); i < n; ++i) {
StringPiece url(attributes[i].url->DecodedValueOrNull());
if (url.empty() || IsDataUrl(url)) {
continue;
}
GoogleUrl gurl(driver_->base_url(), url);
if (gurl.IsWebValid()) {
StringVector decoded_url;
if (driver_->DecodeUrl(gurl, &decoded_url)) {
// An encoded URL.
if (decoded_url.size() == 1) {
driver_->log_record()->SetRewriterLoggingStatus(
RewriteOptions::FilterId(RewriteOptions::kDecodeRewrittenUrls),
RewriterApplication::APPLIED_OK);
// Replace attribute's url with the decoded one.
attributes[i].url->SetValue(decoded_url.at(0));
} else {
// A combined encoded URL.
// TODO(sriharis): What can we do? Creating elements for each
// constituent (that are other wise identical to 'element')?
driver_->log_record()->SetRewriterLoggingStatus(
RewriteOptions::FilterId(RewriteOptions::kDecodeRewrittenUrls),
RewriterApplication::NOT_APPLIED);
}
}
}
}
}
} // namespace net_instaweb