PUBLIC HttpUri *httpLinkUri(HttpConn *conn, cchar *target, MprHash *options) { HttpRoute *route, *lroute; HttpRx *rx; HttpUri *uri; cchar *routeName, *action, *controller, *originalAction, *tplate; char *rest; assert(conn); rx = conn->rx; route = rx->route; controller = 0; if (target == 0) { target = ""; } if (*target == '@') { target = sjoin("{action: '", target, "'}", NULL); } if (*target != '{') { tplate = target; if (!options) { options = route->vars; } } else { if (options) { options = mprBlendHash(httpGetOptions(target), options); } else { options = httpGetOptions(target); } options = mprBlendHash(options, route->vars); /* Prep the action. Forms are: . @action # Use the current controller . @controller/ # Use "index" as the action . @controller/action */ if ((action = httpGetOption(options, "action", 0)) != 0) { originalAction = action; if (*action == '@') { action = &action[1]; } if (strchr(action, '/')) { controller = stok((char*) action, "/", (char**) &action); action = stok((char*) action, "/", &rest); } if (controller) { httpSetOption(options, "controller", controller); } else { controller = httpGetParam(conn, "controller", 0); } if (action == 0 || *action == '\0') { action = "list"; } if (action != originalAction) { httpSetOption(options, "action", action); } } /* Find the template to use. Strategy is this order: . options.template . options.route.template . options.action mapped to a route.template, via: . /app/STAR/action . /app/controller/action . /app/STAR/default . /app/controller/default */ if ((tplate = httpGetOption(options, "template", 0)) == 0) { if ((routeName = httpGetOption(options, "route", 0)) != 0) { routeName = expandRouteName(conn, routeName); lroute = httpLookupRoute(conn->host, routeName); } else { lroute = 0; } if (!lroute) { if ((lroute = httpLookupRoute(conn->host, actionRoute(route, controller, action))) == 0) { if ((lroute = httpLookupRoute(conn->host, actionRoute(route, "{controller}", action))) == 0) { if ((lroute = httpLookupRoute(conn->host, actionRoute(route, controller, "default"))) == 0) { lroute = httpLookupRoute(conn->host, actionRoute(route, "{controller}", "default")); } } } } if (lroute) { tplate = lroute->tplate; } } if (!tplate) { mprLog("error http", 0, "Cannot find template for URI %s", target); target = "/"; } } target = httpTemplate(conn, tplate, options); if ((uri = httpCreateUri(target, 0)) == 0) { return 0; } return uri; }
PUBLIC HttpUri *httpLinkUri(HttpConn *conn, cchar *target, MprHash *options) { HttpRoute *route, *lroute; HttpRx *rx; HttpUri *uri; cchar *routeName, *action, *controller, *originalAction, *tplate; char *rest; rx = conn->rx; route = rx->route; controller = 0; if (target == 0) { target = ""; } if (*target == '@') { target = sjoin("{action: '", target, "'}", NULL); } if (*target != '{') { tplate = target; if (!options) { options = route->vars; } } else { if (options) { options = mprBlendHash(httpGetOptions(target), options); } else { options = httpGetOptions(target); } options = mprBlendHash(options, route->vars); /* Prep the action. Forms are: . @action # Use the current controller . @controller/ # Use "index" as the action . @controller/action */ if ((action = httpGetOption(options, "action", 0)) != 0) { originalAction = action; if (*action == '@') { action = &action[1]; } if (strchr(action, '/')) { controller = stok((char*) action, "/", (char**) &action); action = stok((char*) action, "/", &rest); } if (controller) { httpSetOption(options, "controller", controller); } else { controller = httpGetParam(conn, "controller", 0); } if (action == 0 || *action == '\0') { action = "list"; } if (action != originalAction) { httpSetOption(options, "action", action); } } /* Find the template to use. Strategy is this order: . options.template . options.route.template . options.action mapped to a route.template, via: . /app/STAR/action . /app/controller/action . /app/STAR/default . /app/controller/default */ if ((tplate = httpGetOption(options, "template", 0)) == 0) { if ((routeName = httpGetOption(options, "route", 0)) != 0) { routeName = expandRouteName(conn, routeName); lroute = httpLookupRoute(conn->host, routeName); } else { lroute = 0; } if (!lroute) { if ((lroute = httpLookupRoute(conn->host, actionRoute(route, controller, action))) == 0) { if ((lroute = httpLookupRoute(conn->host, actionRoute(route, "{controller}", action))) == 0) { if ((lroute = httpLookupRoute(conn->host, actionRoute(route, controller, "default"))) == 0) { lroute = httpLookupRoute(conn->host, actionRoute(route, "{controller}", "default")); } } } } if (lroute) { tplate = lroute->tplate; } } if (!tplate) { mprLog("error http", 0, "Cannot find template for URI %s", target); target = "/"; } } target = httpTemplate(conn, tplate, options); uri = httpCreateUri(target, 0); /* This was changed from: httpCreateUri(rx->uri) to rx->parsedUri. The use case was appweb: /auth/form/login which redirects using: https:///auth/form/login on localhost:4443 This must extract the existing host and port from the prior request */ uri = httpResolveUri(rx->parsedUri, 1, &uri, 0); return httpNormalizeUri(uri); }