Support publishing to a hosted-url with a /path
diff --git a/lib/src/command/lish.dart b/lib/src/command/lish.dart
index 325d482..24bdea9 100644
--- a/lib/src/command/lish.dart
+++ b/lib/src/command/lish.dart
@@ -91,7 +91,7 @@
 
     try {
       await log.progress('Uploading', () async {
-        var newUri = server.resolve('/api/packages/versions/new');
+        var newUri = server.resolve('api/packages/versions/new');
         var response = await client.get(newUri, headers: pubApiHeaders);
         var parameters = parseJsonResponse(response);
 
diff --git a/test/lish/archives_and_uploads_a_package_test.dart b/test/lish/archives_and_uploads_a_package_test.dart
index 2efeb4a..e835281 100644
--- a/test/lish/archives_and_uploads_a_package_test.dart
+++ b/test/lish/archives_and_uploads_a_package_test.dart
@@ -39,6 +39,36 @@
     await pub.shouldExit(exit_codes.SUCCESS);
   });
 
+  test('publishes to hosted-url with path', () async {
+    await servePackages();
+    await d.tokensFile({
+      'version': 1,
+      'hosted': [
+        {'url': globalPackageServer.url + '/sub/folder', 'env': 'TOKEN'},
+      ]
+    }).create();
+    var pub = await startPublish(
+      globalPackageServer,
+      path: '/sub/folder',
+      authMethod: 'token',
+      environment: {'TOKEN': 'access token'},
+    );
+
+    await confirmPublish(pub);
+    handleUploadForm(globalPackageServer, path: '/sub/folder');
+    handleUpload(globalPackageServer);
+
+    globalPackageServer.expect('GET', '/create', (request) {
+      return shelf.Response.ok(jsonEncode({
+        'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
+      }));
+    });
+
+    expect(pub.stdout, emits(startsWith('Uploading...')));
+    expect(pub.stdout, emits('Package test_pkg 1.0.0 uploaded!'));
+    await pub.shouldExit(exit_codes.SUCCESS);
+  });
+
   // This is a regression test for #1679. We create a submodule that's not
   // checked out to ensure that file listing doesn't choke on the empty
   // directory.
diff --git a/test/lish/upload_form_fields_has_a_non_string_value_test.dart b/test/lish/upload_form_fields_has_a_non_string_value_test.dart
index 3ecb2fb..15f1cbb 100644
--- a/test/lish/upload_form_fields_has_a_non_string_value_test.dart
+++ b/test/lish/upload_form_fields_has_a_non_string_value_test.dart
@@ -26,7 +26,7 @@
       'url': 'http://example.com/upload',
       'fields': {'field': 12}
     };
-    handleUploadForm(globalPackageServer, body);
+    handleUploadForm(globalPackageServer, body: body);
     expect(pub.stderr, emits('Invalid server response:'));
     expect(pub.stderr, emits(jsonEncode(body)));
     await pub.shouldExit(1);
diff --git a/test/lish/upload_form_fields_is_not_a_map_test.dart b/test/lish/upload_form_fields_is_not_a_map_test.dart
index fed0f38..aea6454 100644
--- a/test/lish/upload_form_fields_is_not_a_map_test.dart
+++ b/test/lish/upload_form_fields_is_not_a_map_test.dart
@@ -23,7 +23,7 @@
     await confirmPublish(pub);
 
     var body = {'url': 'http://example.com/upload', 'fields': 12};
-    handleUploadForm(globalPackageServer, body);
+    handleUploadForm(globalPackageServer, body: body);
     expect(pub.stderr, emits('Invalid server response:'));
     expect(pub.stderr, emits(jsonEncode(body)));
     await pub.shouldExit(1);
diff --git a/test/lish/upload_form_is_missing_fields_test.dart b/test/lish/upload_form_is_missing_fields_test.dart
index a49b0d6..3a36672 100644
--- a/test/lish/upload_form_is_missing_fields_test.dart
+++ b/test/lish/upload_form_is_missing_fields_test.dart
@@ -23,7 +23,7 @@
     await confirmPublish(pub);
 
     var body = {'url': 'http://example.com/upload'};
-    handleUploadForm(globalPackageServer, body);
+    handleUploadForm(globalPackageServer, body: body);
     expect(pub.stderr, emits('Invalid server response:'));
     expect(pub.stderr, emits(jsonEncode(body)));
     await pub.shouldExit(1);
diff --git a/test/lish/upload_form_is_missing_url_test.dart b/test/lish/upload_form_is_missing_url_test.dart
index 50f5fa5..96224e4 100644
--- a/test/lish/upload_form_is_missing_url_test.dart
+++ b/test/lish/upload_form_is_missing_url_test.dart
@@ -26,7 +26,7 @@
       'fields': {'field1': 'value1', 'field2': 'value2'}
     };
 
-    handleUploadForm(globalPackageServer, body);
+    handleUploadForm(globalPackageServer, body: body);
     expect(pub.stderr, emits('Invalid server response:'));
     expect(pub.stderr, emits(jsonEncode(body)));
     await pub.shouldExit(1);
diff --git a/test/lish/upload_form_url_is_not_a_string_test.dart b/test/lish/upload_form_url_is_not_a_string_test.dart
index 99909a4..ba7559a 100644
--- a/test/lish/upload_form_url_is_not_a_string_test.dart
+++ b/test/lish/upload_form_url_is_not_a_string_test.dart
@@ -27,7 +27,7 @@
       'fields': {'field1': 'value1', 'field2': 'value2'}
     };
 
-    handleUploadForm(globalPackageServer, body);
+    handleUploadForm(globalPackageServer, body: body);
     expect(pub.stderr, emits('Invalid server response:'));
     expect(pub.stderr, emits(jsonEncode(body)));
     await pub.shouldExit(1);
diff --git a/test/lish/utils.dart b/test/lish/utils.dart
index 5f18444..ae0960e 100644
--- a/test/lish/utils.dart
+++ b/test/lish/utils.dart
@@ -11,8 +11,8 @@
 
 import '../test_pub.dart';
 
-void handleUploadForm(PackageServer server, [Map body]) {
-  server.expect('GET', '/api/packages/versions/new', (request) {
+void handleUploadForm(PackageServer server, {Map body, String path = ''}) {
+  server.expect('GET', '$path/api/packages/versions/new', (request) {
     expect(
         request.headers, containsPair('authorization', 'Bearer access token'));
 
diff --git a/test/test_pub.dart b/test/test_pub.dart
index 2d68233..0f77615 100644
--- a/test/test_pub.dart
+++ b/test/test_pub.dart
@@ -378,11 +378,12 @@
   List<String> args,
   String authMethod = 'oauth2',
   Map<String, String> environment,
+  String path = '',
 }) async {
   var tokenEndpoint = Uri.parse(server.url).resolve('/token').toString();
   args = ['lish', ...?args];
   return await startPub(args: args, tokenEndpoint: tokenEndpoint, environment: {
-    'PUB_HOSTED_URL': server.url,
+    'PUB_HOSTED_URL': server.url + path,
     '_PUB_TEST_AUTH_METHOD': authMethod,
     if (environment != null) ...environment,
   });