Solved. turns out I was not passing the cookie that keeps you logged
in.
Cookie [] cookies = req.getCookies();
String name = cookies[0].getName();
String value = cookies[0].getValue(); //this holds all
the information that the login servlet needs
to get the authentication cookie from the http request, then passed it
along to the final Upload servlet:
urlConn.setRequestProperty("Cookie", name + "=" +
value);
It worked like a charm!!
On Apr 19, 12:03 pm, "Josh F." <[email protected]> wrote:
> Hello, I'm really at loss trying to track down the source of this
> exception:
>
> Apr 19, 2011 11:53:47 AM com.google.apphosting.utils.jetty.JettyLogger
> warn
> WARNING: /_ah/login
> java.lang.NullPointerException
> at
> com.google.appengine.api.users.dev.LoginCookieUtils.encodeEmailAsUserId(LoginCookieUtils.java:
> 89)
> at
> com.google.appengine.api.users.dev.LoginCookieUtils.createCookie(LoginCookieUtils.java:
> 41)
> at
> com.google.appengine.api.users.dev.LocalLoginServlet.doPost(LocalLoginServlet.java:
> 90)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
> at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:
> 511)
> at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1166)
> at
> com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:
> 58)
> at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1157)
> at
> com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:
> 43)
> at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1157)
> at
> com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:
> 122)
> at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1157)
> at
> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:
> 388)
> at
> org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:
> 216)
> at
> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:
> 182)
> at
> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:
> 765)
> at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
> 418)
> at
> com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:
> 70)
> at
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
> 152)
> at com.google.appengine.tools.development.JettyContainerService
> $ApiProxyHandler.handle(JettyContainerService.java:351)
> at
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
> 152)
> at org.mortbay.jetty.Server.handle(Server.java:326)
> at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
> 542)
> at org.mortbay.jetty.HttpConnection
> $RequestHandler.content(HttpConnection.java:938)
> at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
> at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
> at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
> at
> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:
> 409)
> at org.mortbay.thread.QueuedThreadPool
> $PoolThread.run(QueuedThreadPool.java:582)
>
> This is occurring on my development server after running the app as a
> Web Application through eclipse. The app basically stores .html files
> in the blobstore, and allows the user to edit the html file through a
> small jQuery based HTML editor.
>
> I can retrieve the .html file contents from the blobstore using
> fetchData to return a byte array of the contents. But once the user
> has made changes to the html code via the editor, I'm trying to update
> the entry in the DATASTORE that references the BlobKey string for the
> corresponding .html file. So I am using a MultiPartFormOutputStream to
> write directly to the request headers and simulate an HTTP POST
> request.
>
> Here is the code I have:
>
> byte[] htmlData = content.getBytes();
> for(int k=0; k<htmlData.length; k++)
> {
> resp.getWriter().println("Byte " + k + ": " +
> htmlData[k]);
> }
> BlobstoreService blobstoreService =
> BlobstoreServiceFactory.getBlobstoreService();
> String uploadURL =
> blobstoreService.createUploadUrl("/upload");
>
> //add host if in dev mode
> if(uploadURL.indexOf("http") == -1)
> {
> uploadURL = "http://localhost:8888" + uploadURL;
> }
> URL url = new URL(uploadURL);
> // create a boundary string
> String boundary = MultiPartFormOutputStream.createBoundary();
> URLConnection urlConn =
> MultiPartFormOutputStream.createConnection(url);
> urlConn.setReadTimeout(15000);
> urlConn.setRequestProperty("Accept", "*/*");
> urlConn.setRequestProperty("Content-Type",
> MultiPartFormOutputStream.getContentType(boundary));
> // set some other request headers...
> urlConn.setRequestProperty("Connection", "Keep-Alive");
> urlConn.setRequestProperty("Cache-Control", "no-cache");
> // no need to connect because getOutputStream() does it
> MultiPartFormOutputStream out = new
> MultiPartFormOutputStream(urlConn.getOutputStream(), boundary);
> // write a text field element - This should be removed -
> left over
> from multipart library demo code
> out.writeField("old", oldBlobKey);
> out.writeField("lob", lineOfBusiness);
> out.writeField("topic", topic);
> out.writeField("category", category);
> out.writeField("key", key);
> // write bytes directly
> out.writeFile("myFile", "application/octet-stream",
> "content.html",
> htmlData);
> out.close();
>
> // read response from server
>
> BufferedReader responseIn = new BufferedReader(new
> InputStreamReader(urlConn.getInputStream()));
> StringBuilder redirectResponse = new StringBuilder();
> String line="";
> while((line = responseIn.readLine()) != null)
> {
> redirectResponse.append(line);
> }
> resp.getWriter().println(redirectResponse);
>
> Essentially the user is directed to a servlet with this code upon
> clicking the Update button on the HTML editor. The POST data is then
> passed along via the MultiPartFormOutputStream to another servlet
> called Upload.
>
> Here is the code for Upload:
>
> public class Upload extends HttpServlet
> {
> private BlobstoreService blobstoreService =
> BlobstoreServiceFactory.getBlobstoreService();
>
> public void doPost(HttpServletRequest req, HttpServletResponse
> res) throws ServletException, IOException
> {
> Map<String, BlobKey> blobs =
> blobstoreService.getUploadedBlobs(req);
> BlobKey blobKey = blobs.get("myFile");
> String content = blobKey.getKeyString();
> String oldKeyStr = req.getParameter("old");
> BlobKey oldKey = new BlobKey(oldKeyStr);
> String lineOfBusiness = req.getParameter("lob");
> String topic = req.getParameter("topic");
> String category = req.getParameter("category");
> Long key = Long.parseLong(req.getParameter("key"));
> //delete old blob
> blobstoreService.delete(oldKey);
> //First, grab the old object.
> PersistenceManager pm = PMF.get().getPersistenceManager();
> Topic t = pm.getObjectById(Topic.class, key);
> t.setContent(content);
> t.setLineOfBusiness(lineOfBusiness);
> t.setTopic(topic);
> t.setCategory(category);
> try
> {
> pm.makePersistent(t);
> }
> finally
> {
> pm.close();
> }
> res.sendRedirect("topics.jsp");
> }
>
> }
--
You received this message because you are subscribed to the Google Groups
"Google App Engine for Java" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-appengine-java?hl=en.