views:

492

answers:

3

Is there a way to use WebDAV with J2ME (some libraries or manual coding)?

I've tried:
- javax.microedition.io.HttpConnection, but "SEARCH" method not supported there
- javax.microedition.io.SocketConnection with Http request - nothing returns in response
Maybe something wrong with my code or HTTP header:

 String response = "";
 String query = "<?xml version='1.0'?> " 
   + "<g:searchrequest xmlns:g='DAV:'> "
   + "<g:sql> "
   + "SELECT 'DAV:displayname' "
   + "FROM 'http://exchangeserver.com/Public/' "
   + "</g:sql> "
   + "</g:searchrequest> ";
 String len = String.valueOf(query.length());
 SocketConnection hc = (SocketConnection) Connector
   .open("socket://exchangeserver.com:8080");
 DataOutputStream dout = 
   new DataOutputStream(hc.openOutputStream());
 DataInputStream din = new DataInputStream(hc.openInputStream());
 String userPass = "username" + ":" + "password";
 byte[] encoded = 
   Base64OutputStream.encode(userPass.getBytes(), 0,
   userPass.length(), false, false);
 ByteArrayOutputStream bos = new ByteArrayOutputStream();
 String request = "SEARCH /Public/ HTTP/1.1\r\n"
   +"Content-Type:text/xml\r\nContent-Length:"
   + len
   + "\r\nAuthorization:Basic "
   + new String(encoded)
   + "\r\n\r\n";
 bos.write(request.getBytes());
 bos.write(query.getBytes());
 dout.write(bos.toByteArray());
 dout.flush();
 dout.close();
 byte[] bs = new byte[900];
 din.readFully(bs);
 bos = new ByteArrayOutputStream();
 bos.write(bs);
 din.close();
 hc.close();
 response = bos.toString();
+2  A: 

What do you mean by "nothing returns"? No response body? No status code?

I recommend to trace what's going on on the "wire"...

UPDATE: have you tried adding a host header?

Julian Reschke
Thanks for your answer Julian. Nothing returns in SocketConnection InputStream (which stands for response). Ok, I'll try to sniff traffic.
Max Gontar
No, I didn't try add host header, I will try that also.
Max Gontar
+1  A: 

FYI If you are testing on an actual mobile phone, then there is a fair chance your mobile network operator could be blocking non-HTTP traffic.

You might want to first check that you can make GET and POST requests to the server first.

QuickRecipesOnSymbianOS
+1  A: 

Julian +1 you was right for Host property, QRSO +1, thanks to all! So,
- I have found free WebDAV service MyDisk.se (SEARCH not allowed, so I used PROPFIND)
- used WFetch to play around with WebDAV request
- used Network Monitor to compare requests from WFetch and my app.
:) Finally it's working! Result code:

String response = "";
String query = "<?xml version='1.0' encoding='UTF-8'?>\r\n"
  + "<d:propfind xmlns:d='DAV:'>\r\n"
  + "<d:prop><d:getcontenttype/></d:prop>\r\n"
  + "<d:prop><d:getcontentlength/></d:prop>\r\n"
  + "</d:propfind>\r\n";

String len = String.valueOf(query.length());
SocketConnection hc = (SocketConnection) Connector
  .open("socket://79.99.7.153:80");
DataOutputStream dout = new DataOutputStream(hc.openOutputStream());
DataInputStream din = new DataInputStream(hc.openInputStream());
String userPass = "login" + ":" + "password";
byte[] encoded = Base64OutputStream.encode(userPass.getBytes(), 0,
  userPass.length(), false, false);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String request = "PROPFIND /mgontar/ HTTP/1.1\r\n" 
  + "Depth: 1\r\n"
  + "Host: mydisk.se:80\r\n" 
  + "Accept: */*\r\n"
  + "Content-Type: text/xml\r\n" 
  + "Content-Length: " + len
  + "\r\nAuthorization: Basic " + new String(encoded)
  + "\r\n\r\n";
bos.write(request.getBytes());
bos.write(query.getBytes());
dout.write(bos.toByteArray());
dout.flush();
dout.close();
byte[] bs = new byte[900];
din.readFully(bs);
bos = new ByteArrayOutputStream();
bos.write(bs);
din.close();
hc.close();
response = bos.toString();
Max Gontar