Support non-canonical extensions in Python upb unknown fields.

PiperOrigin-RevId: 970866648
diff --git a/python/BUILD.bazel b/python/BUILD.bazel
index 20b73d0..4bc0695 100644
--- a/python/BUILD.bazel
+++ b/python/BUILD.bazel
@@ -124,6 +124,7 @@
         "//upb/message",
         "//upb/message:compare",
         "//upb/message:copy",
+        "//upb/message:message_unknowns",
         "//upb/mini_table",
         "//upb/port",
         "//upb/reflection",
@@ -131,6 +132,7 @@
         "//upb/util:def_to_proto",
         "//upb/util:required_fields",
         "//upb/wire",
+        "//upb/wire:encode_extension",
         "//upb/wire:eps_copy_input_stream",
         "//upb/wire:reader",
         "@abseil-cpp//absl/base:core_headers",
diff --git a/python/unknown_fields.c b/python/unknown_fields.c
index 4739472..5c90f6d 100644
--- a/python/unknown_fields.c
+++ b/python/unknown_fields.c
@@ -13,7 +13,9 @@
 #include "python/message.h"
 #include "python/protobuf.h"
 #include "upb/base/string_view.h"
+#include "upb/mem/arena.h"
 #include "upb/message/message.h"
+#include "upb/message/unknown_fields.h"
 #include "upb/reflection/def.h"
 #include "upb/wire/eps_copy_input_stream.h"
 #include "upb/wire/reader.h"
@@ -266,7 +268,8 @@
 
   uintptr_t iter = kUpb_Message_UnknownBegin;
   upb_StringView view;
-  while (upb_Message_NextUnknown(msg, &view, &iter)) {
+  upb_Arena* upb_arena = NULL;
+  while (upb_Message_NextWireFormatUnknown(msg, &upb_arena, &view, &iter)) {
     const char* ptr = view.data;
     upb_EpsCopyInputStream stream;
     upb_EpsCopyInputStream_Init(&stream, &ptr, view.size);
@@ -280,11 +283,13 @@
     }
 
     if (!ok) {
+      if (upb_arena) upb_Arena_Free(upb_arena);
       Py_DECREF(&self->ob_base);
       return NULL;
     }
   }
 
+  if (upb_arena) upb_Arena_Free(upb_arena);
   return &self->ob_base;
 }