Oh no problem, I was intending this as a reply to the "you guys"  
Marius used, to make it clear that I don't have a particular use case,  
though I do agree about the soft 404s.

-Ross


On Dec 30, 2009, at 11:22 AM, Alex Black wrote:

>> At any rate, I'm just trying to help Alex, I'm not invested in any
>> reason other than it's informative to try and solve. Is there any way
>> to get a templated 404 response?
>
> Sorry Ross, perhaps my response didn't convey my appreciation for your
> help, or maybe it came off sounding negative, I didn't mean that.
>
> What I meant was: thanks for offering that solution, it looks like a
> step forward, I appreciate your help, but based on my gut feeling
> looking at that code and based on Marius's opinon, I don't think we're
> yet at an elegant robust solution, so lets keep coming up with more
> ideas.
>
> - Alex
>
>>
>> -Ross
>>
>> On Dec 30, 2009, at 4:32 AM, Marius wrote:
>>
>>> Re init-ing S is a very risky thing to do. You loose all your  
>>> context
>>> information. uriNotFound is called by Lift from several key points.
>>> From those key points, Lift uses the S context and updates the
>>> function Map. With your example if your template is binding Scala
>>> functions, those function will be written to a function map that  
>>> will
>>> not be seen by Lift as you're writing to a different S context.
>>
>>> I would advice no doing such things or if you do, then expect side
>>> effects. In general avoid bypassing Lift's rendering pipeline. Lift
>>> does a lot of things some of them internal and missing those you can
>>> get into nasty hidden problems.
>>
>>> For head merge you could use HeadHelper.scala but note that  
>>> internally
>>> Lift doesn't use this ... it uses a more sophisticated head  
>>> merge ...
>>> see LiftMerge.scala. HeadHelper holds the old merge. IMO it should  
>>> be
>>> removed.
>>
>>> I'm not really sure why you guys don't like redirects, probably to
>>> avoid traffic, but IMO this is not very relevant. But regardless,  
>>> you
>>> guys have your own reasons.
>>
>>> Br's,
>>> Marius
>>
>>> On Dec 30, 9:39 am, Ross Mellgren <dri...@gmail.com> wrote:
>>>> I think the problem with the site map is that the request you have
>>>> is for a page that doesn't exist so it can't build the current- 
>>>> page-
>>>> relative sitemap.
>>
>>>> Here's a version that works:
>>
>>>> In Boot:
>>
>>>>         val notFoundNode = <lift:embed what="404" />
>>>>         LiftRules.uriNotFound.prepend {
>>>>             case _ => XhtmlTemplateResponse(notFoundNode, 404)
>>>>         }
>>
>>>> And the other part:
>>
>>>> object XhtmlTemplateResponse extends HeaderStuff {
>>>>     def apply(nodeToRender: NodeSeq, statusCode: Int): LiftResponse
>>>> = {
>>>>         val renderedNode = {
>>>>             val forceToRoot: LiftRules.RewritePF = { case _ =>
>>>> RewriteResponse(Req.parsePath("/"), TreeMap.empty, true) }
>>>>             for (req <- S.request; session <- S.session) yield
>>>>                 S.init(Req(req, forceToRoot::Nil), session) {
>>>>                     session.processSurroundAndInclude("/",
>>>> nodeToRender)
>>>>                 }
>>>>         } openOr {
>>>>             error("No session")
>>>>         }
>>
>>>>         new XhtmlResponse(Group(renderedNode), Empty, headers,
>>>> cookies, statusCode, false)
>>>>     }
>>
>>>> }
>>
>>>> The secret sauce is reiniting S with a new request that has been
>>>> rewritten to seem as if it were a hit to /
>>
>>>> I'm not sure if this is a good idea, but it seems to work for the
>>>> site map thing.
>>
>>>> However, I can't find a way to make the head merge work properly.
>>>> It looks like the head merging lies in the code path inside
>>>> LiftSession that is private to Lift. You could rearrange your
>>>> template to make only one head I guess, or wait until someone more
>>>> wise than I can direct you as far as that goes.
>>
>>>> -Ross
>>
>>>> On Dec 30, 2009, at 12:32 AM, Alex Black wrote:
>>
>>>>> I noticed another problem: the head merge is not working in this
>>>>> scenario, the resulting page is not valid XHTML because it has two
>>>>> head tags :)  So, this makes me think I'm going about things the
>>>>> wrong
>>>>> way.
>>
>>>>> I'm hoping you can suggest the right way, to create a custom 404
>>>>> page,
>>>>> correctly (without a redirect, with 404 status code), and
>>>>> processed by
>>>>> the template engine so it uses our default template with sitemap
>>>>> etc.
>>
>>>>> - Alex
>>
>>>>> On Dec 30, 12:22 am, Alex Black <a...@alexblack.ca> wrote:
>>>>>> One more detail:
>>
>>>>>> notFoundNode is defined like this:
>>
>>>>>>   val notFoundNode = <lift:embed what="404" />
>>
>>>>>> and 404.html like this:
>>
>>>>>> <lift:surround with="default" at="content">
>>>>>>     <head>
>>>>>>         <title>Page Not Found</title>
>>>>>>     </head>
>>>>>>         <h1>Page Not Found</h1>
>>>>>>         <p>We couldn't find the page you were looking for.</p>
>>>>>> </lift:surround>
>>
>>>>>> And my default.html hidden template has a site map tag in it, and
>>>>>> the
>>>>>> sitemap contains a number of entries.
>>
>>>>>> On Dec 30, 12:14 am, Alex Black <a...@alexblack.ca> wrote:
>>
>>>>>>> I emailed Ross directly and said I did run with -
>>>>>>> Drun.mode=production.
>>
>>>>>>> Here's what I'm seeing:
>>>>>>> 1. If I run with -Drun.mode=production, and I access a not found
>>>>>>> url,
>>>>>>> say mysite.com/foobar, then, I *do* see the custom 404 page as
>>>>>>> expected, but, where I normally see my sitemap I see "No
>>>>>>> Navigation
>>>>>>> Defined".
>>>>>>> 2. If I run *without* that production flag, and I access a not
>>>>>>> found
>>>>>>> url, I get a blank white screen that says "The requested page
>>>>>>> was not
>>>>>>> defined in your SiteMap, so access was blocked.  (This message  
>>>>>>> is
>>>>>>> displayed in development mode only)".
>>
>>>>>>> So #2 is expected, #1 is not.
>>
>>>>>>> Ross, when you emailed me you said you tried to reproduce this,
>>>>>>> but I
>>>>>>> think one difference between your scenario and mine is that on
>>>>>>> my 404
>>>>>>> page I have a sitemap rendered.
>>
>>>>>>> So instead of what dpp had:
>>
>>>>>>> LiftRules.uriNotFound.prepend {
>>>>>>>       case _ =>  XhtmlResponse((<html> <body>Silly goose</ 
>>>>>>> body> </
>>>>>>> html>),
>>>>>>>                                Empty, List("Content-Type" ->
>>>>>>> "text/
>>>>>>> html;
>>>>>>> charset=utf-8"), Nil, 404, S.ieMode)
>>>>>>>     }
>>
>>>>>>> I have:
>>
>>>>>>>     // Catch 404s
>>>>>>>     LiftRules.uriNotFound.prepend {
>>>>>>>       case (req, _) => XhtmlTemplateResponse(notFoundNode, 404)
>>>>>>>     }
>>
>>>>>>> with
>>
>>>>>>> object XhtmlTemplateResponse extends HeaderStuff {
>>>>>>>   def apply(nodeToRender: Node, statusCode: Int): LiftResponse  
>>>>>>> = {
>>>>>>>     val renderedNode = S.render(nodeToRender,
>>>>>>> S.request.get.request).first
>>>>>>>     new XhtmlResponse(renderedNode, Empty, headers, cookies,
>>>>>>> statusCode, false)
>>>>>>>   }
>>
>>>>>>> }
>>
>>>>>>> - Alex
>>
>>>>>>> On Dec 29, 7:49 pm, Ross Mellgren <dri...@gmail.com> wrote:
>>
>>>>>>>> This is the production run mode thing dpp talked about. Try
>>>>>>>> your app with -Drun.mode=production
>>
>>>>>>>> -Ross
>>
>>>>>>>> On Dec 29, 2009, at 7:39 PM, Alex Black wrote:
>>
>>>>>>>>> Thanks for pointing that out, the catch-all sounds dangerous.
>>
>>>>>>>>> I tried your suggestion, and it works well except I'm
>>>>>>>>> encountering one
>>>>>>>>> issue, my sitemap renders as "No Navigation Defined." for urls
>>>>>>>>> that
>>>>>>>>> are not found.   I'm using 1.1-M8, I launched jetty in
>>>>>>>>> production mode
>>>>>>>>> as you indicated, and added the passNotFoundToChain = false.
>>
>>>>>>>>> Did you expect that - or is the passNotFoundToChain meant to
>>>>>>>>> solve the
>>>>>>>>> sitemap issue?
>>
>>>>>>>>> - Alex
>>
>>>>>>>>> On Dec 29, 6:10 pm, David Pollak  
>>>>>>>>> <feeder.of.the.be...@gmail.com>
>>>>>>>>> wrote:
>>>>>>>>>> Keep in mind that Lift's behavior for 404s differs between
>>>>>>>>>> development and
>>>>>>>>>> production mode in Lift 1.1-xxx
>>
>>>>>>>>>> To have your app/Lift handle a 404 rather than passing it to
>>>>>>>>>> your web
>>>>>>>>>> container, in Boot.scala:
>>
>>>>>>>>>>     LiftRules.passNotFoundToChain = false
>>
>>>>>>>>>>     LiftRules.uriNotFound.prepend {
>>>>>>>>>>       case _ =>  XhtmlResponse((<html> <body>Silly goose</
>>>>>>>>>> body> </html>),
>>>>>>>>>>                                Empty, List("Content-Type" ->
>>>>>>>>>> "text/html;
>>>>>>>>>> charset=utf-8"), Nil, 404, S.ieMode)
>>>>>>>>>>     }
>>
>>>>>>>>>> In development mode, Lift will tell you about SiteMap as this
>>>>>>>>>> was a common
>>>>>>>>>> confusion point among new developers.  In production mode,
>>>>>>>>>> Lift will use
>>>>>>>>>> that code.  To put Lift in production mode:
>>
>>>>>>>>>> mvn -Drun.mode=production jetty:run
>>
>>>>>>>>>> I would strongly recommend against a "catch-all" entry in
>>>>>>>>>> SiteMap as it will
>>>>>>>>>> expose every page on your site to access.
>>
>>>>>>>>>> On Tue, Dec 29, 2009 at 11:17 AM, Alex Black
>>>>>>>>>> <a...@alexblack.ca> wrote:
>>>>>>>>>>> Ok, I got this working, with 1.1-M8 using S.render.
>>
>>>>>>>>>>>  // A node which embeds our 404 template (e.g. 404.html)
>>>>>>>>>>>  val notFoundNode =
>>>>>>>>>>>    <lift:embed what="404" />
>>
>>>>>>>>>>>    // Catch 404s
>>>>>>>>>>>    LiftRules.uriNotFound.prepend {
>>>>>>>>>>>      case (req, _) => XhtmlTemplateResponse(notFoundNode,  
>>>>>>>>>>> 404)
>>>>>>>>>>>    }
>>
>>>>>>>>>>>  // If you're using a sitemap, make sure you have a catch-
>>>>>>>>>>> all item,
>>>>>>>>>>> e.g
>>>>>>>>>>>  //    Menu(Loc("Catchall", Pair(Nil, true), "", Hidden ::
>>>>>>>>>>> Nil)) ::
>>
>>>>>>>>>>> using this object:
>>
>>>>>>>>>>>  object XhtmlTemplateResponse extends HeaderStuff {
>>>>>>>>>>>    def apply(nodeToRender: Node, statusCode: Int):
>>>>>>>>>>> LiftResponse = {
>>>>>>>>>>>      val renderedNode = S.render(nodeToRender,
>>>>>>>>>>> S.request.get.request).first
>>>>>>>>>>>      new XhtmlResponse(renderedNode, Empty, headers,  
>>>>>>>>>>> cookies,
>>>>>>>>>>> statusCode, false)
>>>>>>>>>>>    }
>>>>>>>>>>>  }
>>
>>>>>>>>>>> I think the wiki page:
>>>>>>>>>>> http://wiki.liftweb.net/index.php/Setting_up_a_custom_404_page
>>>>>>>>>>> should be updated.  The current code hides the 404 status
>>
>> ...
>>
>> read more ยป
>
> --
>
> You received this message because you are subscribed to the Google  
> Groups "Lift" group.
> To post to this group, send email to lift...@googlegroups.com.
> To unsubscribe from this group, send email to 
> liftweb+unsubscr...@googlegroups.com 
> .
> For more options, visit this group at 
> http://groups.google.com/group/liftweb?hl=en 
> .
>
>

--

You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to lift...@googlegroups.com.
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en.


Reply via email to