Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library pub_dartlang_org.handlers; | 5 library pub_dartlang_org.handlers; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:math'; | 8 import 'dart:math'; |
| 9 import 'dart:convert'; | 9 import 'dart:convert'; |
| 10 | 10 |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 221 if (responseAsJson) { | 221 if (responseAsJson) { |
| 222 return packageShowHandlerJson(request, Uri.decodeComponent(path)); | 222 return packageShowHandlerJson(request, Uri.decodeComponent(path)); |
| 223 } else { | 223 } else { |
| 224 return packageShowHandlerHtml(request, Uri.decodeComponent(path)); | 224 return packageShowHandlerHtml(request, Uri.decodeComponent(path)); |
| 225 } | 225 } |
| 226 } | 226 } |
| 227 | 227 |
| 228 var package = Uri.decodeComponent(path.substring(0, slash)); | 228 var package = Uri.decodeComponent(path.substring(0, slash)); |
| 229 if (path.substring(slash).startsWith('/versions')) { | 229 if (path.substring(slash).startsWith('/versions')) { |
| 230 path = path.substring(slash + '/versions'.length); | 230 path = path.substring(slash + '/versions'.length); |
| 231 if (path.startsWith('/') && path.endsWith('.yaml')) { | 231 if (path.startsWith('/')) { |
| 232 path = path.substring(1, path.length - '.yaml'.length); | 232 if (path.endsWith('.yaml')) { |
| 233 String version = Uri.decodeComponent(path); | 233 path = path.substring(1, path.length - '.yaml'.length); |
| 234 return packageVersionHandlerYaml(request, package, version); | 234 String version = Uri.decodeComponent(path); |
| 235 return packageVersionHandlerYaml(request, package, version); | |
| 236 } else { | |
| 237 path = path.substring(1); | |
| 238 String version = Uri.decodeComponent(path); | |
| 239 return packageVersionHandlerHtml(request, package, version); | |
| 240 } | |
| 235 } else { | 241 } else { |
| 236 return packageVersionsHandler(request, package); | 242 return packageVersionsHandler(request, package); |
| 237 } | 243 } |
| 238 } | 244 } |
| 239 return _notFoundHandler(request); | 245 return _notFoundHandler(request); |
| 240 } | 246 } |
| 241 | 247 |
| 242 /// Handles requests for /packages/<package> - JSON | 248 /// Handles requests for /packages/<package> - JSON |
| 243 packageShowHandlerJson(shelf.Request request, String packageName) async { | 249 packageShowHandlerJson(shelf.Request request, String packageName) async { |
| 244 Package package = await backend.lookupPackage(packageName); | 250 Package package = await backend.lookupPackage(packageName); |
| 245 if (package == null) return _notFoundHandler(request); | 251 if (package == null) return _notFoundHandler(request); |
| 246 | 252 |
| 247 var versions = await backend.versionsOfPackage(packageName); | 253 var versions = await backend.versionsOfPackage(packageName); |
| 248 _sortVersionsDesc(versions, decreasing: false); | 254 _sortVersionsDesc(versions, decreasing: false); |
| 249 | 255 |
| 250 var json = { | 256 var json = { |
| 251 'name' : package.name, | 257 'name' : package.name, |
| 252 'uploaders': package.uploaderEmails, | 258 'uploaders': package.uploaderEmails, |
| 253 'versions': | 259 'versions': |
| 254 versions.map((packageVersion) => packageVersion.version).toList(), | 260 versions.map((packageVersion) => packageVersion.version).toList(), |
| 255 }; | 261 }; |
| 256 return _jsonResponse(json); | 262 return _jsonResponse(json); |
| 257 } | 263 } |
| 258 | 264 |
| 259 /// Handles requests for /packages/<package> - HTML | 265 /// Handles requests for /packages/<package> - HTML |
| 260 packageShowHandlerHtml(shelf.Request request, String packageName) async { | 266 packageShowHandlerHtml(shelf.Request request, String packageName) async { |
| 267 return packageVersionHandlerHtml(request, packageName, null); | |
| 268 } | |
| 269 | |
| 270 /// Handles requests for /packages/<package>/versions | |
| 271 packageVersionsHandler(shelf.Request request, String packageName) async { | |
| 272 var versions = await backend.versionsOfPackage(packageName); | |
| 273 if (versions.isEmpty) return _notFoundHandler(request); | |
| 274 | |
| 275 _sortVersionsDesc(versions); | |
| 276 | |
| 277 var versionDownloadUrls = await Future.wait( | |
| 278 versions.map((PackageVersion version) { | |
| 279 return backend.downloadUrl(packageName, version.version); | |
| 280 }).toList()); | |
| 281 | |
| 282 return _htmlResponse(templateService.renderPkgVersionsPage( | |
| 283 packageName, versions, versionDownloadUrls)); | |
| 284 } | |
| 285 | |
| 286 /// Handles requests for /packages/<package>/versions/<version> | |
| 287 packageVersionHandlerHtml(request, String packageName, String versionName) async { | |
|
Søren Gjesse
2016/06/17 07:03:37
Long line.
kustermann
2016/06/28 09:53:31
Done.
| |
| 261 String cachedPage; | 288 String cachedPage; |
| 262 if (backend.uiPackageCache != null) { | 289 if (backend.uiPackageCache != null) { |
| 263 cachedPage = await backend.uiPackageCache.getUIPackagePage(packageName); | 290 cachedPage = await backend.uiPackageCache.getUIPackagePage( |
| 291 packageName, versionName); | |
| 264 } | 292 } |
| 265 | 293 |
| 266 if (cachedPage == null) { | 294 if (cachedPage == null) { |
| 267 Package package = await backend.lookupPackage(packageName); | 295 Package package = await backend.lookupPackage(packageName); |
| 268 if (package == null) return _notFoundHandler(request); | 296 if (package == null) return _notFoundHandler(request); |
| 269 | 297 |
| 270 var versions = await backend.versionsOfPackage(packageName); | 298 var versions = await backend.versionsOfPackage(packageName); |
| 271 _sortVersionsDesc(versions); | |
| 272 | 299 |
| 273 var latestVersion = versions.where( | 300 _sortVersionsDesc(versions, decreasing: true, pubSorting: true); |
| 274 (version) => version.key == package.latestVersionKey).first; | 301 var latestStable = versions[0]; |
| 302 var first10Versions = versions.take(10).toList(); | |
| 275 | 303 |
| 276 var first10Versions = versions.take(10).toList(); | 304 _sortVersionsDesc(versions, decreasing: true, pubSorting: false); |
| 305 var latestDev = versions[0]; | |
| 306 | |
| 307 var selectedVersion; | |
| 308 if (versionName != null) { | |
| 309 for (var v in versions) { | |
| 310 if (v.version == versionName) selectedVersion = v; | |
| 311 } | |
| 312 // TODO: cache error? | |
| 313 if (selectedVersion == null) { | |
| 314 return _notFoundHandler(request); | |
| 315 } | |
| 316 } else { | |
| 317 if (selectedVersion == null) { | |
| 318 selectedVersion = latestStable; | |
| 319 } | |
| 320 } | |
| 277 | 321 |
| 278 var versionDownloadUrls = await Future.wait( | 322 var versionDownloadUrls = await Future.wait( |
| 279 first10Versions.map((PackageVersion version) { | 323 first10Versions.map((PackageVersion version) { |
| 280 return backend.downloadUrl(packageName, version.version); | 324 return backend.downloadUrl(packageName, version.version); |
| 281 }).toList()); | 325 }).toList()); |
| 282 | 326 |
| 283 cachedPage = templateService.renderPkgShowPage( | 327 cachedPage = templateService.renderPkgShowPage( |
| 284 package, first10Versions, versionDownloadUrls, latestVersion, | 328 package, first10Versions, versionDownloadUrls, selectedVersion, |
| 285 versions.length); | 329 latestStable, latestDev, versions.length); |
| 286 if (backend.uiPackageCache != null) { | 330 if (backend.uiPackageCache != null) { |
| 287 await backend.uiPackageCache.setUIPackagePage(packageName, cachedPage); | 331 await backend.uiPackageCache.setUIPackagePage( |
| 332 packageName, versionName, cachedPage); | |
| 288 } | 333 } |
| 289 } | 334 } |
| 290 | 335 |
| 291 return _htmlResponse(cachedPage); | 336 return _htmlResponse(cachedPage); |
| 292 } | 337 } |
| 293 | 338 |
| 294 /// Handles requests for /packages/<package>/versions | |
| 295 packageVersionsHandler(shelf.Request request, String packageName) async { | |
| 296 var versions = await backend.versionsOfPackage(packageName); | |
| 297 if (versions.isEmpty) return _notFoundHandler(request); | |
| 298 | |
| 299 _sortVersionsDesc(versions); | |
| 300 | |
| 301 var versionDownloadUrls = await Future.wait( | |
| 302 versions.map((PackageVersion version) { | |
| 303 return backend.downloadUrl(packageName, version.version); | |
| 304 }).toList()); | |
| 305 | |
| 306 return _htmlResponse(templateService.renderPkgVersionsPage( | |
| 307 packageName, versions, versionDownloadUrls)); | |
| 308 } | |
| 309 | |
| 310 /// Handles requests for /packages/<package>/versions/<version>.yaml | 339 /// Handles requests for /packages/<package>/versions/<version>.yaml |
| 311 packageVersionHandlerYaml(request, String package, String version) async { | 340 packageVersionHandlerYaml(request, String package, String version) async { |
| 312 var packageVersion = await backend.lookupPackageVersion(package, version); | 341 var packageVersion = await backend.lookupPackageVersion(package, version); |
| 313 if (packageVersion == null) { | 342 if (packageVersion == null) { |
| 314 return _notFoundHandler(request); | 343 return _notFoundHandler(request); |
| 315 } else { | 344 } else { |
| 316 return _yamlResponse(packageVersion.pubspec.jsonString); | 345 return _yamlResponse(packageVersion.pubspec.jsonString); |
| 317 } | 346 } |
| 318 } | 347 } |
| 319 | 348 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 431 status, | 460 status, |
| 432 body: content, | 461 body: content, |
| 433 headers: {'content-type' : 'application/atom+xml; charset="utf-8"'}); | 462 headers: {'content-type' : 'application/atom+xml; charset="utf-8"'}); |
| 434 } | 463 } |
| 435 | 464 |
| 436 shelf.Response _redirectResponse(url) { | 465 shelf.Response _redirectResponse(url) { |
| 437 return new shelf.Response.seeOther(url); | 466 return new shelf.Response.seeOther(url); |
| 438 } | 467 } |
| 439 | 468 |
| 440 | 469 |
| 441 /// Sorts [versions] according to the semantic versioning specification. | 470 /// Sorts [versions] according to the semantic versioning specification. |
|
Søren Gjesse
2016/06/17 07:03:37
Please add a comment on the difference between pub
kustermann
2016/06/28 09:53:31
Done.
| |
| 442 void _sortVersionsDesc(List<PackageVersion> versions, {bool decreasing: true}) { | 471 void _sortVersionsDesc(List<PackageVersion> versions, |
| 472 {bool decreasing: true, bool pubSorting: true}) { | |
| 443 versions.sort((PackageVersion a, PackageVersion b) { | 473 versions.sort((PackageVersion a, PackageVersion b) { |
| 444 if (decreasing) { | 474 if (pubSorting) { |
| 445 return semver.Version.prioritize(b.semanticVersion, a.semanticVersion); | 475 if (decreasing) { |
| 476 return semver.Version.prioritize(b.semanticVersion, a.semanticVersion); | |
| 477 } else { | |
| 478 return semver.Version.prioritize(a.semanticVersion, b.semanticVersion); | |
| 479 } | |
| 446 } else { | 480 } else { |
| 447 return semver.Version.prioritize(a.semanticVersion, b.semanticVersion); | 481 if (decreasing) { |
| 482 return b.semanticVersion.compareTo(a.semanticVersion); | |
| 483 } else { | |
| 484 return a.semanticVersion.compareTo(b.semanticVersion); | |
| 485 } | |
| 448 } | 486 } |
| 449 }); | 487 }); |
| 450 } | 488 } |
| 451 | 489 |
| 452 | 490 |
| 453 /// Extracts the 'page' query parameter from [url]. | 491 /// Extracts the 'page' query parameter from [url]. |
| 454 /// | 492 /// |
| 455 /// Returns a valid positive integer. If [maxPages] is given, the result is | 493 /// Returns a valid positive integer. If [maxPages] is given, the result is |
| 456 /// clamped to [maxPages]. | 494 /// clamped to [maxPages]. |
| 457 int _pageFromUrl(Uri url, {int maxPages}) { | 495 int _pageFromUrl(Uri url, {int maxPages}) { |
| 458 var pageAsString = url.queryParameters['page']; | 496 var pageAsString = url.queryParameters['page']; |
| 459 int pageAsInt = 1; | 497 int pageAsInt = 1; |
| 460 if (pageAsString != null) { | 498 if (pageAsString != null) { |
| 461 try { | 499 try { |
| 462 pageAsInt = max(int.parse(pageAsString), 1); | 500 pageAsInt = max(int.parse(pageAsString), 1); |
| 463 } catch (_, __) { } | 501 } catch (_, __) { } |
| 464 } | 502 } |
| 465 | 503 |
| 466 if (maxPages != null && pageAsInt > maxPages) pageAsInt = maxPages; | 504 if (maxPages != null && pageAsInt > maxPages) pageAsInt = maxPages; |
| 467 return pageAsInt; | 505 return pageAsInt; |
| 468 } | 506 } |
| OLD | NEW |