diff --git a/src/infrastructure/javelin/markup.php b/src/infrastructure/javelin/markup.php
--- a/src/infrastructure/javelin/markup.php
+++ b/src/infrastructure/javelin/markup.php
@@ -77,9 +77,27 @@
   $is_post = (strcasecmp($http_method, 'POST') === 0);
 
   $http_action = idx($attributes, 'action');
-  $is_absolute_uri = 0;
-  if (phutil_nonempty_string($http_action)) {
+
+  if ($http_action === null) {
+    // Not sure what this is.
+    $is_absolute_uri = false;
+
+  } else if ($http_action instanceof PhutilURI) {
+    // This is the happy path, I think
+
+    // For now, this is close enough - I suspect we'll stay with "https" schema
+    // for the rest of eternity.
+    $protocol = $http_action->getProtocol();
+    $is_absolute_uri = ($protocol == 'http' || $protocol == 'https');
+
+  } else if (is_string($http_action)) {
+    // Also good path?
     $is_absolute_uri = preg_match('#^(https?:|//)#', $http_action);
+  } else {
+    throw new Exception(
+      pht(
+        'Unexpected object type provided as `action` - %s',
+        gettype($http_action)));
   }
 
   if ($is_post) {