You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2013/12/28 21:24:53 UTC

svn commit: r1553907 - in /subversion/trunk/subversion/libsvn_ra_serf: ra_serf.h util.c

Author: rhuijben
Date: Sat Dec 28 20:24:53 2013
New Revision: 1553907

URL: http://svn.apache.org/r1553907
Log:
Create a helper function to create a more detailed error when the
xml parsing fails.

* subversion/libsvn_ra_serf/ra_serf.h
  (svn_ra_serf__xml_parser_t): Remove unneeded flag.

* subversion/libsvn_ra_serf/util.c
  (parse_xml): New function.
  (inject_to_parser,
   svn_ra_serf__process_pending,
   svn_ra_serf__handle_xml_parser): Use parse_xml.

Modified:
    subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h
    subversion/trunk/subversion/libsvn_ra_serf/util.c

Modified: subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h?rev=1553907&r1=1553906&r2=1553907&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h Sat Dec 28 20:24:53 2013
@@ -625,13 +625,6 @@ struct svn_ra_serf__xml_parser_t {
    */
   svn_ra_serf__list_t *done_item;
 
-  /* If this flag is TRUE, errors during parsing will be ignored.
-   *
-   * This is mainly used when we are processing an error XML response to
-   * avoid infinite loops.
-   */
-  svn_boolean_t ignore_errors;
-
   /* If an error occurred, this value will be non-NULL. */
   svn_error_t *error;
 

Modified: subversion/trunk/subversion/libsvn_ra_serf/util.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/util.c?rev=1553907&r1=1553906&r2=1553907&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/util.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/util.c Sat Dec 28 20:24:53 2013
@@ -1268,6 +1268,24 @@ write_to_pending(svn_ra_serf__xml_parser
                                              scratch_pool));
 }
 
+/* svn_error_t * wrapper around XML_Parse */
+static APR_INLINE svn_error_t *
+parse_xml(XML_Parser parser, const char *data, apr_size_t len, svn_boolean_t is_final)
+{
+  int xml_status = XML_Parse(parser, data, (int)len, is_final);
+  const char *msg;
+
+  if (xml_status == XML_STATUS_OK)
+    return SVN_NO_ERROR;
+
+  msg = XML_ErrorString(XML_GetErrorCode(parser));
+
+  return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA,
+                          svn_error_createf(SVN_ERR_XML_MALFORMED, NULL,
+                                            _("Malformed XML: %s"),
+                                            msg),
+                          _("The XML response contains invalid XML"));
+}
 
 static svn_error_t *
 inject_to_parser(svn_ra_serf__xml_parser_t *ctx,
@@ -1275,27 +1293,11 @@ inject_to_parser(svn_ra_serf__xml_parser
                  apr_size_t len,
                  const serf_status_line *sl)
 {
-  int xml_status;
-
-  xml_status = XML_Parse(ctx->xmlp, data, (int) len, 0);
+  svn_error_t *xml_err;
 
-  if (! ctx->ignore_errors)
-    {
-      SVN_ERR(ctx->error);
-
-      if (xml_status != XML_STATUS_OK)
-        {
-          if (sl == NULL)
-            return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
-                                     _("XML parsing failed"));
+  xml_err = parse_xml(ctx->xmlp, data, len, FALSE);
 
-          return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
-                                   _("XML parsing failed: (%d %s)"),
-                                   sl->code, sl->reason);
-        }
-     }
-
-  return SVN_NO_ERROR;
+  return svn_error_trace(svn_error_compose_create(ctx->error, xml_err));
 }
 
 /* Apr pool cleanup handler to release an XML_Parser in success and error
@@ -1374,25 +1376,18 @@ svn_ra_serf__process_pending(svn_ra_serf
   if (pending_empty &&
       parser->pending->network_eof)
     {
-      int xml_status;
+      svn_error_t *err;
       SVN_ERR_ASSERT(parser->xmlp != NULL);
 
       /* Tell the parser that no more content will be parsed. */
-      xml_status = XML_Parse(parser->xmlp, NULL, 0, 1);
+      err = parse_xml(parser->xmlp, NULL, 0, TRUE);
+
+      err = svn_error_compose_create(parser->error, err);
 
       apr_pool_cleanup_run(parser->pool, &parser->xmlp, xml_parser_cleanup);
       parser->xmlp = NULL;
 
-      if (! parser->ignore_errors)
-        {
-          SVN_ERR(parser->error);
-
-          if (xml_status != XML_STATUS_OK)
-            {
-              return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
-                                       _("XML parsing failed"));
-            }
-        }
+      SVN_ERR(err);
 
       add_done_item(parser);
     }
@@ -1462,11 +1457,6 @@ svn_ra_serf__handle_xml_parser(serf_requ
       else
         {
           err = inject_to_parser(ctx, data, len, &sl);
-          if (err)
-            {
-              /* Should have no errors if IGNORE_ERRORS is set.  */
-              SVN_ERR_ASSERT(!ctx->ignore_errors);
-            }
         }
       if (err)
         {
@@ -1491,24 +1481,16 @@ svn_ra_serf__handle_xml_parser(serf_requ
              in the PENDING structures, then we're completely done.  */
           if (!HAS_PENDING_DATA(ctx->pending))
             {
-              int xml_status;
+              svn_error_t *err;
               SVN_ERR_ASSERT(ctx->xmlp != NULL);
 
-              xml_status = XML_Parse(ctx->xmlp, NULL, 0, 1);
+              err = parse_xml(ctx->xmlp, NULL, 0, TRUE);
+
+              err = svn_error_compose_create(ctx->error, err);
 
               apr_pool_cleanup_run(ctx->pool, &ctx->xmlp, xml_parser_cleanup);
 
-              if (! ctx->ignore_errors)
-                {
-                  SVN_ERR(ctx->error);
-
-                  if (xml_status != XML_STATUS_OK)
-                    {
-                      return svn_error_create(
-                                    SVN_ERR_XML_MALFORMED, NULL,
-                                    _("The XML response contains invalid XML"));
-                    }
-                }
+              SVN_ERR(err);
 
               add_done_item(ctx);
             }