Arlolra has uploaded a new change for review.
https://gerrit.wikimedia.org/r/164512
Change subject: Cleanup article parsing routes with promises
......................................................................
Cleanup article parsing routes with promises
Change-Id: Ide1d9e2d205b9205ddad70fc673d1ec00c71f20c
---
M api/routes.js
1 file changed, 91 insertions(+), 108 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/parsoid
refs/changes/12/164512/1
diff --git a/api/routes.js b/api/routes.js
index 4cf4b95..dc47e7a 100644
--- a/api/routes.js
+++ b/api/routes.js
@@ -240,121 +240,104 @@
if ( env.conf.parsoid.allowCORS ) {
// allow cross-domain requests (CORS) so that parsoid service
// can be used by third-party sites
- apiUtils.setHeader( res, env, 'Access-Control-Allow-Origin',
env.conf.parsoid.allowCORS );
+ apiUtils.setHeader( res, env, 'Access-Control-Allow-Origin',
+
env.conf.parsoid.allowCORS );
}
function sendRes( doc ) {
- try {
- apiUtils.setHeader(res, env, 'X-Parsoid-Performance',
env.getPerformanceHeader());
- if ( v2 && v2.format === "pagebundle" ) {
- var dp =
doc.ownerDocument.getElementById('mw-data-parsoid');
- dp.parentNode.removeChild(dp);
- apiUtils.jsonResponse(res, env, {
- html: DU.serializeNode( doc ),
- "data-parsoid": JSON.parse(dp.text)
- });
- } else {
- apiUtils.setHeader(res, env, 'Content-Type',
'text/html; charset=UTF-8');
- apiUtils.endResponse(res, env,
DU.serializeNode( doc ));
- }
- env.log("info", "completed parsing in",
env.performance.duration, "ms");
- } catch (e) {
- env.log("fatal/request", e);
- }
- }
-
- var tmpCb;
- if ( wt ) {
- wt = wt.replace( /\r/g, '' );
- env.log('info', 'starting parsing');
-
- // clear default page name
- if ( !res.local('pageName') ) {
- env.page.name = '';
- }
-
- var parser =
env.pipelineFactory.getPipeline('text/x-mediawiki/full');
- parser.once('document', function( document ) {
- // Don't cache requests when wt is set in case somebody
uses
- // GET for wikitext parsing
- apiUtils.setHeader(res, env, 'Cache-Control',
'private,no-cache,s-maxage=0' );
- sendRes( req.body.body ? document.body : document );
- });
-
- tmpCb = function( src_and_metadata ) {
- // Set the source
- env.setPageSrcInfo( src_and_metadata );
-
- try {
- parser.processToplevelDoc( wt );
- } catch ( e ) {
- env.log("fatal/request", e);
- return;
- }
- };
-
- if ( !res.local('pageName') || !oldid ) {
- // no pageName supplied; don't fetch the page source
- tmpCb( wt );
- return;
- }
-
- } else {
- if ( oldid ) {
- env.log('info', 'starting parsing');
-
- if ( !req.headers.cookie ) {
- apiUtils.setHeader(res, env, 'Cache-Control',
's-maxage=2592000' );
- } else {
- // Don't cache requests with a session
- apiUtils.setHeader(res, env, 'Cache-Control',
'private,no-cache,s-maxage=0' );
- }
-
- // Indicate the MediaWiki revision in a header as well
for
- // ease of extraction in clients.
- apiUtils.setHeader(res, env, 'content-revision-id',
oldid);
-
- tmpCb = function( src_and_metadata ) {
- return parse( env, req, res, src_and_metadata
).then( sendRes );
- };
+ apiUtils.setHeader(res, env, 'X-Parsoid-Performance',
env.getPerformanceHeader());
+ if ( v2 && v2.format === "pagebundle" ) {
+ var dp =
doc.ownerDocument.getElementById('mw-data-parsoid');
+ dp.parentNode.removeChild(dp);
+ apiUtils.jsonResponse(res, env, {
+ html: DU.serializeNode( doc ),
+ "data-parsoid": JSON.parse(dp.text)
+ });
} else {
- // Don't cache requests with no oldid
- apiUtils.setHeader(res, env, 'Cache-Control',
'private,no-cache,s-maxage=0' );
- tmpCb = function( src_and_metadata ) {
- // Set the source
- env.setPageSrcInfo( src_and_metadata );
- oldid = env.page.meta.revision.revid;
-
- var path = "/";
- if ( v2 ) {
- path += [
- "v2",
- url.parse(
env.conf.parsoid.interwikiMap.get( prefix ) ).host,
- encodeURIComponent( target ),
- v2.format,
- oldid
- ].join("/");
- } else {
- path += [
- prefix,
- encodeURIComponent( target ) +
"?oldid=" + oldid
- ].join("/");
- }
-
- // Redirect to oldid
- apiUtils.relativeRedirect({
- "path": path,
- "res": res,
- "env": env
- });
- env.log("info", "redirected to revision",
env.page.meta.revision.revid);
- };
+ apiUtils.setHeader(res, env, 'Content-Type',
'text/html; charset=UTF-8');
+ apiUtils.endResponse(res, env, DU.serializeNode( doc
));
}
+ env.log("info", "completed parsing in",
env.performance.duration, "ms");
}
- return promiseTemplateReq( env, target, oldid ).then(
- tmpCb
- ).catch(function( err ) {
+ function hasWt( wt ) {
+ env.log('info', 'starting parsing');
+ // Set the source
+ env.setPageSrcInfo( wt );
+ return new Promise(function( resolve, reject ) {
+ var parser =
env.pipelineFactory.getPipeline('text/x-mediawiki/full');
+ parser.once('document', function( doc ) {
+ // Don't cache requests when wt is set in case
somebody uses
+ // GET for wikitext parsing
+ apiUtils.setHeader(res, env, 'Cache-Control',
'private,no-cache,s-maxage=0');
+ resolve( req.body.body ? doc.body : doc );
+ });
+ parser.processToplevelDoc( wt );
+ }).then( sendRes );
+ }
+
+ function hasHtmlAndOldid( src_and_metadata ) {
+ env.log('info', 'starting parsing');
+ if ( !req.headers.cookie ) {
+ apiUtils.setHeader(res, env, 'Cache-Control',
's-maxage=2592000');
+ } else {
+ // Don't cache requests with a session
+ apiUtils.setHeader(res, env, 'Cache-Control',
'private,no-cache,s-maxage=0');
+ }
+ // Indicate the MediaWiki revision in a header as well for
+ // ease of extraction in clients.
+ apiUtils.setHeader(res, env, 'content-revision-id', oldid);
+ return parse( env, req, res, src_and_metadata ).then( sendRes );
+ }
+
+ function hasHtmlWithoutOldid( src_and_metadata ) {
+ // Don't cache requests with no oldid
+ apiUtils.setHeader(res, env, 'Cache-Control',
'private,no-cache,s-maxage=0');
+ // Set the source
+ env.setPageSrcInfo( src_and_metadata );
+ oldid = env.page.meta.revision.revid;
+
+ var path = "/";
+ if ( v2 ) {
+ path += [
+ "v2",
+ url.parse( env.conf.parsoid.interwikiMap.get(
prefix ) ).host,
+ encodeURIComponent( target ),
+ v2.format,
+ oldid
+ ].join("/");
+ } else {
+ path += [
+ prefix,
+ encodeURIComponent( target ) + "?oldid=" + oldid
+ ].join("/");
+ }
+
+ // Redirect to oldid
+ apiUtils.relativeRedirect({ "path": path, "res": res, "env":
env });
+ env.log("info", "redirected to revision",
env.page.meta.revision.revid);
+ }
+
+ var p;
+ if ( wt && (!res.local('pageName') || !oldid) ) {
+ // clear default page name
+ env.page.name = '';
+
+ // don't fetch the page source
+ p = Promise.resolve( wt.replace(/\r/g, '') );
+ } else {
+ p = promiseTemplateReq( env, target, oldid );
+ }
+
+ if ( wt ) {
+ p = p.then( hasWt );
+ } else if ( oldid ) {
+ p = p.then( hasHtmlAndOldid );
+ } else {
+ p = p.then( hasHtmlWithoutOldid );
+ }
+
+ return p.catch(function( err ) {
env.log("fatal/request", err);
});
}
--
To view, visit https://gerrit.wikimedia.org/r/164512
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ide1d9e2d205b9205ddad70fc673d1ec00c71f20c
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Arlolra <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits