You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by Nico Verwer <nv...@be-value.nl> on 2003/10/08 17:07:27 UTC
SourceResolver does not send parameters?
Hello Cocoon developers,
I am trying to fetch a zip-file from a remote server and use this in a
generator and in cincludes later in my pipeline.
The zip-file is stored locally, because I do not want to repeat requests.
More importantly, the zip-file is *generated* on the remote server in
response to a HTTP POST request with a parameter named 'query'.
In order to achieve this, I wrote an action (this may a totally wrong
approach, please tell me) 'HttpFileAction' (code follows at the end of this
message). This requests the zip-file, stores it in a temporary file and sets
the sitemap variables filepath and fileurl (indicating where the file is
stored).
I use the action in my sitemap as follows:
<map:match pattern="test">
<map:act type="httpFile" src="http://remoteserver/zipfile-url">
<map:parameter name="query" value="{request-param:query}"/>
<map:generate type="file" src="jar:{fileurl}/!contents.xml"/>
</map:act>
<map:serialize type="xml"/>
</map:match>
The zip-file contains a document called 'contents.xml', which is what I'd
like to see when I request 'test'.
The problem is that the remote server does not get the 'query' parameter. I
tested this by substituting a URL on my own server for the remoteserver URL:
<map:match pattern="test">
<map:act type="httpFile" src="http://myserver/showrequest">
<map:parameter name="query" value="{request-param:query}"/>
<map:generate type="file" src="{fileurl}"/> <!-- no /!contents.xml
! -->
</map:act>
<map:serialize type="xml"/>
</map:match>
The showrequest is dealt with in the following pipeline:
<map:match pattern="showrequest">
<map:generate type="request"/>
<map:serialize type="xml"/>
</map:match>
This shows me the request, as expected, but the <h:requestParameters /> is
empty!
It seems that the parameters are not sent by the SourceResolver that was
passed to my action (see code below). The SourceResolver appears to be a
org.apache.cocoon.environment.http.HttpEnvironment, which uses another
SourceResolver in a protected variable that I can't see.
I also don't see a way to indicate that the request should be POST, not GET.
Does anyone know how to pass parameters? Is there a better way that I didn't
think of?
Cheers, Nico.
--- Code of my action ---
package nl.kluwer; <!-- The people who hire me at the moment. -->
import java.io.*;
import java.util.Map;
import java.util.HashMap;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.acting.AbstractAction;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Redirector;
import org.apache.cocoon.environment.Request;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.excalibur.source.Source;
public class HttpFileAction extends AbstractAction {
public Map act (Redirector redirector,
SourceResolver resolver,
Map objectModel,
String source,
Parameters params) {
Map sitemapParams = new HashMap();
Source actionSource = null;
try {
actionSource = resolver.resolveURI(source, null,
Parameters.toProperties(params));
<!-- I have tried building a HashMap for the parameters instead, with
the same result. -->
} catch (Exception e) {
getLogger().error("Cannot resolve HTTP-file action: "+e.toString());
return null;
}
try {
File tmpFile = File.createTempFile(source.replaceAll("[:/]", "_"),
".zip");
InputStream tmpIn = actionSource.getInputStream();
FileWriter tmpOut = new FileWriter(tmpFile.getPath());
for (int c = tmpIn.read(); c >= 0; c = tmpIn.read()) {
tmpOut.write(c);
}
tmpOut.close();
sitemapParams.put("filepath", tmpFile.getPath());
sitemapParams.put("fileurl", tmpFile.toURI().toString());
} catch (Exception e) {
getLogger().error("Cannot write file for HTTP-file action:
"+e.toString());
return null;
}
return sitemapParams;
}
}
Re: SourceResolver does not send parameters?
Posted by Bruno Dumon <br...@outerthought.org>.
On Wed, 2003-10-08 at 17:07, Nico Verwer wrote:
> Hello Cocoon developers,
<snip/>
> The problem is that the remote server does not get the 'query' parameter. I
> tested this by substituting a URL on my own server for the remoteserver URL:
<snip/>
> actionSource = resolver.resolveURI(source, null,
> Parameters.toProperties(params));
The parameters you supply here as third argument to the resolveURI
method aren't added to the request URI. Instead, the Map you supply
should contain a key SourceResolver.URI_PARAMETERS with as value an
instance of org.apache.excalibur.source.SourceParameters.
--
Bruno Dumon http://outerthought.org/
Outerthought - Open Source, Java & XML Competence Support Center
bruno@outerthought.org bruno@apache.org