Coder Social home page Coder Social logo

sardine's Introduction

GitHub commit GitHub license Build Status

Sardine is useful for interacting with a webdav server and is much easier to programmatically manage remote files than with FTP.

I looked at the other Java webdav clients out there slide, Jackrabbit and webdavclient4j. None of them do things quite the way I wanted.

The UsageGuide documents how to use Sardine. If you are hungry, this is an appetizer for retrieving a directory listing from a remote webdav server:

Sardine sardine = SardineFactory.begin();
List<DavResource> resources = sardine.list("http://yourdavserver.com/adirectory/");
for (DavResource res : resources)
{
     System.out.println(res);
}

Sardine is focused on being a useful library for common use cases. I also need it to support the latest version of HttpClient. It abstracts away the connection details and provides easy to use methods to accomplish webdav'y actions.

There is a SardineTask so that you can use Sardine directly in your Ant scripts.

Sardine uses JAXB to process XML responses from the webdav server. The generated code for this is based on the excellent webdav.xsd contained in the Apache Wink project.

Sardine is fully stable and is being used in production on a very high traffic site (140+ concurrent connections 24/7). Click the Issues tab to submit requests. Most development is just adding new use cases. Check back often for new releases.

Questions? Please ask on our mailing list. Issues? File an issue in the github issue tracker.

Sardine available under the Apache License 2.0.

If you like this library, I'd appreciate if you would blog/tweet about it. If you don't like it, well...

sardine's People

Contributors

8ware avatar andrea-rockt avatar arusin avatar aucl avatar binwiederhier avatar blutorange avatar chudzikp avatar dankarp avatar dconnelly avatar dependabot[bot] avatar dkocher avatar fengxx avatar ghudo avatar hakanai avatar ivarmont avatar jochenberger avatar kkofler avatar lookfirst avatar mcdee avatar mscheibler avatar nigredo-tori avatar olivierlemasle avatar philboers avatar rafox2005 avatar rickardnarsromlink avatar sergeikarimov avatar stlhrt avatar tolbkni avatar ylangisc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sardine's Issues

Mavenize

Original author: [email protected] (January 05, 2010 08:30:29)

Currently, the project is built using ANT.

Switching to a maven2 project would have the following advantages:

  • The dependency management would be done in a pom.xml file rather than
    commited on SVN
  • JAR files would not need to be commited into SVN
  • Maven2 automates the compiling, unit testing and packaging steps
  • Maven2 artifacts (i.e., the JAR file corresponding to sardine) can be
    made available to others as a Maven2 dependency, downloadable by everyone

Original issue: http://code.google.com/p/sardine/issues/detail?id=1

createDirectory and getResources HTTP/1.1 415 Unsupported Media Type

Original author: [email protected] (March 21, 2010 21:43:22)

What steps will reproduce the problem?
1.sardine.createDirectory
("http://www.Verasonics.com/VerasonicsWebDav/TestFolder/");
2.sardine.getResources("http://www.Verasonics.com/VerasonicsWebDav/");

What is the expected output? What do you see instead?
Expect the directory to be created. Instead get an exception.
Expect a directory listing to be returned. Instead get an exception.

What version of the product are you using? On what operating system?
97, Windows XP SP 3, 32-bit, JRE 1.5 32-bit.

Please provide any additional information below.

Output with exception is listed below. Looking around a bit in the Java
debugger, I saw the "415" HTTP error message.

The server is Microsoft IIS.

Other Sardine commands work:
// X getResources, HTTP/1.1 415 Unsupported Media Type
// V getInputStream
// V put, V put
// V delete
// X createDirectory, HTTP/1.1 415 Unsupported Media Type
// X move fails to delete original
// V copy
// V exists

SoftwareReleaseTools version 1.3.119
Please provide logon creditials
for "http://www.Verasonics.com/VerasonicsWebDav/".
Destination: "http://www.Verasonics.com/VerasonicsWebDav/TestFolder/"
Encoded: "http://www.Verasonics.com/VerasonicsWebDav/TestFolder/"
ERROR! Exception when accessing WebDAV. Details:
com.googlecode.sardine.util.SardineException: The server has returned an
HTTP error
com.googlecode.sardine.util.SardineException: The server has returned an
HTTP error
at com.googlecode.sardine.SardineImpl.createDirectory
(SardineImpl.java:334)
at
com.verasonics.softwarereleasetools.SoftwareReleaseTools.copyMexToWebDav
(SoftwareReleaseTools.java:1256)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.verasonics.softwarereleasetools.SoftwareReleaseTools.main
(SoftwareReleaseTools.java:165)

Original issue: http://code.google.com/p/sardine/issues/detail?id=37

"Unsupported Media Type" at createDir

Original author: [email protected] (March 19, 2010 14:38:51)

Hi,
I have – another – problem with creating directories. Whenever I try to
create a directory, I receive a http error Sardine Exception:<Unsupported
Media Type>, ServerReturnCode: -1
I issue
sardine.createDirectory("https://sd2dav.1und1.de/c/");

‘c’ is the directory to be created on root. I tried with ‘/’ and without at
the end, no way. Also sardine.getresources() works ok, so no
authentication issue.

When inspecting the code, I found the mkcol string in
sardineutil.createDirectoryEntity (). When debugging I found
StringEntity CREATE_DIRECTORY.contentEncoding=null
when the String is created. Could that be the problem ?

Regards
/Gerd

Original issue: http://code.google.com/p/sardine/issues/detail?id=35

Sardine.exists(String url) should work for directories as well

Original author: [email protected] (April 07, 2010 14:09:03)

currently it does not and returns false

the following code works with apache-commons-http-client-3.1.jar and may help:

import java.io.IOException;

import java.net.HttpURLConnection;
import java.net.URL;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.log4j.Logger;

public class WebdavHelper {
private static final Logger log = Logger.getLogger(WebdavHelper.class);

public static boolean dirExists(String url, String user, String pass)
throws IOException {
URL url2 = new URL(url);
HttpClient client = new HttpClient();
client.getState().setCredentials(new AuthScope(url2.getHost(),
url2.getPort()), new UsernamePasswordCredentials(user, pass));
GetMethod get = new GetMethod(url);
get.setDoAuthentication(true);
int status = client.executeMethod(get);
log.debug("response code: " + status);
if (log.isTraceEnabled())
log.trace("response msg: " + get.getResponseBodyAsString());
get.releaseConnection();
return status == HttpURLConnection.HTTP_OK;
}
}

Original issue: http://code.google.com/p/sardine/issues/detail?id=48

sardine-71 had dependancy on java 1.6 (ssl was broken)

Original author: [email protected] (January 28, 2010 11:25:18)

What steps will reproduce the problem?

  1. Sardine sardine = SardineFactory.begin("aa", "bb");

What is the expected output?
A successful connection.

What do you see instead?
java.lang.NoSuchMethodError

What version of the product are you using? On what operating system?
Sardine-71
Java 5
Win32 Vista

Please provide any additional information below.

Maybe not really a bug but when you don't use a keystore, the following
line (114) is called in SardineImpl:

SSLContext context = SSLContext.getDefault();

The method getDefault is only available in Java 1.6. So the documentation
should mention a dependency on 1.6 or the code needs to be adjusted so the
scheme 'https' is only registered when there is a keystore present.

Original issue: http://code.google.com/p/sardine/issues/detail?id=20

sardine misinterprets content-type of first sub-directory

Original author: [email protected] (February 24, 2010 07:29:05)

What steps will reproduce the problem?

I'm trying to recursively output an entire directory tree like so:

public static void showDirectoryStructure(Sardine sardine, String url, String prefix) {
    try {
        List&lt;DavResource&gt; resources = sardine.getResources(url);
        for (DavResource res : resources) {
            //Logger.getLogger(Main.class.getName()).log(Level.INFO, res.toString(), res.getName());
            if (res.isDirectory() &amp;&amp; !res.isCurrentDirectory()) {

                System.out.println(prefix + res.getName());

                showDirectoryStructure(sardine, res.getAbsoluteUrl(), &quot;-&quot; + prefix);
            }
        }
    } catch (SardineException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
}

The first sub-directory is not output since it's content-type is set to text/html:

DavResource [baseUrl=http://localhost/uploads/commons-codec-1.4/, contentLength=0,
contentType=text/html, creation=Wed Feb 24 01:31:56 CET 2010, modified=Thu Aug 06
18:42:40 CEST 2009, name=apidocs, nameDecoded=apidocs,
getAbsoluteUrl()=http://localhost/uploads/commons-codec-1.4/apidocs, isDirectory()=false]

What is the expected output? What do you see instead?

Expected Output:

  • commons-codec-1.4
    -- apidocs

Actual Output:

  • commons-codec-1.4

What version of the product are you using? On what operating system?
Version 80 on Mac OS X 10.6.2

Please provide any additional information below.

Original issue: http://code.google.com/p/sardine/issues/detail?id=23

Move Copies but Fails to Delete

Original author: [email protected] (March 21, 2010 21:36:03)

What steps will reproduce the problem?

  1. sardine.copy
    ("http://www.Verasonics.com/VerasonicsWebDav/TestFile.txt", "http://www.Ver
    asonics.com/VerasonicsWebDav/TestFile2.txt");

What is the expected output? What do you see instead?
Expect to see "TestFile2.txt" only, but "TestFile.txt" is still there too.

What version of the product are you using? On what operating system?
97, Windows XP SP 3, 32-bit, JRE 1.5.

Please provide any additional information below.

Original issue: http://code.google.com/p/sardine/issues/detail?id=36

Problems with the Tomcat WebDAV servlet

Original author: [email protected] (January 05, 2010 09:25:36)

When I try to getResources() on a Tomcat WebDAV servlet, I have exceptions
like:

javax.xml.bind.UnmarshalException: unexpected element (uri:"",
local:"html"). Expected elements are
<{DAV:}activelock>,<{DAV:}allprop>,<{DAV:}collection>,<{DAV:}creationdate>,<{DAV:}depth>,<{DAV:}displayname>,<{DAV:}dst>,<{DAV:}error>,<{DAV:}exclusive>,<{DAV:}getcontentlanguage>,<{DAV:}getcontentlength>,<{DAV:}getcontenttype>,<{DAV:}getetag>,<{DAV:}getlastmodified>,<{DAV:}href>,<{DAV:}keepalive>,<{DAV:}link>,<{DAV:}lockdiscovery>,<{DAV:}lockentry>,<{DAV:}lockinfo>,<{DAV:}lockscope>,<{DAV:}locktoken>,<{DAV:}locktype>,<{DAV:}multistatus>,<{DAV:}omit>,<{DAV:}owner>,<{DAV:}prop>,<{DAV:}propertybehavior>,<{DAV:}propertyupdate>,<{DAV:}propfind>,<{DAV:}propname>,<{DAV:}propstat>,<{DAV:}remove>,<{DAV:}resourcetype>,<{DAV:}response>,<{DAV:}responsedescription>,<{DAV:}set>,<{DAV:}shared>,<{DAV:}source>,<{DAV:}src>,<{DAV:}status>,<{DAV:}supportedlock>,<{DAV:}timeout>,<{DAV:}write>
at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642)
at
com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:247)
at
com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:242)
at
com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116)
at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1049)
at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:478)
at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459)
at
com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:148)
at
com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501)
at
com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)
at
com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626)
at
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3095)
at
com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:921)
at
com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at
com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
at
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
at
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at
com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
at
com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at
com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:211)
at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184)
at
javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)
at
javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184)
at com.googlecode.sardine.SardineImpl.getResources(SardineImpl.java:96)

Is this normal?

Original issue: http://code.google.com/p/sardine/issues/detail?id=5

return getStatusCode() from put

Original author: [email protected] (February 25, 2010 00:52:53)

What steps will reproduce the recommedation?

  1. do a put
  2. void is the return type
  3. no response to know whether it was successful 200/201 or otherwise

What is the expected output? What do you see instead?
It would be nice (like using the httpclient directly) if doing a put
returned the same info.

What version of the product are you using? On what operating system?
73 solaris

Please provide any additional information below.
pretty straight forward really - thanks for the work you have put in so
far, your project is definately useful.

Original issue: http://code.google.com/p/sardine/issues/detail?id=25

jdk5 classifier on jaxb brings unneccessary complexity

Original author: oc%[email protected] (March 04, 2010 22:43:54)

What steps will reproduce the problem?

  1. Remove the -jdk5 classifier jars (from your ~/.m2 and optional mirrors)
  2. mvn clean install
  3. --

What is the expected output? What do you see instead?

The jars with classifier -jdk5 are not in maven central. Jars without are. It
would be easier to install and use sardine if one didn't have to manually
install jars.

mvn dependency:tree
...
[INFO] +- com.googlecode.sardine:sardine:jar:80:compile
[INFO] | +- javax.xml.bind:jaxb-api:jar:jdk5:2.1:compile
[INFO] | - com.sun.xml.bind:jaxb-impl:jar:jdk5:2.1.12:compile
[INFO] | - javax.xml.bind:jaxb-api:jar:2.1:compile
...
Desired:
[INFO] +- com.googlecode.sardine:sardine:jar:80:compile
[INFO] | +- javax.xml.bind:jaxb-api:jar:2.1:compile
[INFO] | - com.sun.xml.bind:jaxb-impl:jar:2.1.12:compile

What version of the product are you using? On what operating system?
maven 2.2.0, sardine 80, OSX 10.6.x

Please provide any additional information below.
Solutions:
A) Remove <classsifier>jdk5</classifier> from the dependencies..
B) Set <scope>provided</provided>
C) Include them in an jdk1.5 activation profile :)

Original issue: http://code.google.com/p/sardine/issues/detail?id=33

getRecources and put not working

Original author: [email protected] (March 02, 2010 15:02:26)

What steps will reproduce the problem?
final String webDavUser = "user";
final String webDavPass = "pw";
final String webDavServer = "http://somedomain.de:8080/pathA/pathB/"
final Sardine s = SardineFactory.begin(webDavUser,webDavPass);
final InputStream fis = new FileInputStream(new File("c:\lokalFileName.ext")

s.put(webDavServer, fis);
s.getResources(url);

What is the expected output? What do you see instead?
I expect that the file is uploaded and in the result of s.getRessources()
I get this errors on calling the put(,) Method:
com.googlecode.sardine.util.SardineException
at com.googlecode.sardine.SardineImpl.executeWrapper(SardineImpl.java:349)
at com.googlecode.sardine.SardineImpl.put(SardineImpl.java:251)
at test.net.schmithuesen.tools.probeSardine.main(probeSardine.java:24)
Caused by: org.apache.http.client.ClientProtocolException
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:643)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
at com.googlecode.sardine.SardineImpl.executeWrapper(SardineImpl.java:345)
... 2 more
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot
retry request with a non-repeatable request entity.
at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:474)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
... 5 more

This ones i get if i try a getRessources(_):
com.googlecode.sardine.util.SardineException: Problem unmarshalling the data
at
com.googlecode.sardine.util.SardineUtil.getMulitstatus(SardineUtil.java:279)
at com.googlecode.sardine.SardineImpl.getResources(SardineImpl.java:116)
at test.net.schmithuesen.tools.probeSardine.main(probeSardine.java:26)
Caused by: javax.xml.bind.UnmarshalException

  • with linked exception:
    [org.xml.sax.SAXParseException: Premature end of file.]
    at
    javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)
    at
    com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:503)
    at
    com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:204)
    at
    com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:173)
    at
    javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)
    at
    javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184)
    at
    com.googlecode.sardine.util.SardineUtil.getMulitstatus(SardineUtil.java:275)
    ... 2 more
    Caused by: org.xml.sax.SAXParseException: Premature end of file.
    at
    com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at
    com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
    at
    com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
    at
    com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1414)
    at
    com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1059)
    at
    com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
    at
    com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
    at
    com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at
    com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
    at
    com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
    at
    com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
    at
    com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
    at
    com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
    at
    com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:200)
    ... 6 more
    What version of the product are you using? On what operating system?
    I use sardine-80 on win7, i tried it with a JBoss(Tomcat) serving webdav
    (basic auth) as well as https://mediacenter.gmx.net

Please provide any additional information below.
This might not be a bug, but i could not find any forum or email of the
owner on this side i could write to. So i file you a bug ;-).
Additionally i needed to get commons-codec-1.4, without it httpClient cried
for BASE64 class missing.

Original issue: http://code.google.com/p/sardine/issues/detail?id=27

The MKCOL method is missing

Original author: [email protected] (January 06, 2010 09:13:31)

The MKCOL method, use to create directories, is missing

Details are on http://tools.ietf.org/html/draft-ietf-vcarddav-webdav-mkcol-06

Example request and response:

>> Request <<

MKCOL /home/special/ HTTP/1.1
Host: special.example.com
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<mkcol xmlns="DAV:">
<set>
<prop>
<resourcetype>
<collection/>
</resourcetype>
<displayname/>
</prop>
</set>
</mkcol>

>> Response <<

HTTP/1.1 201 Created
Cache-Control: no-cache
Date: Sat, 11 Nov 2006 09:32:12 GMT

Original issue: http://code.google.com/p/sardine/issues/detail?id=9

way of Listing

Original author: [email protected] (March 03, 2010 15:58:48)

Imagine the following situation:

The directory is
https://mywebdav/d/Transfer
https://mywebdav/d/Transfer/file1.txt
https://mywebdav/d/Transfer/file2.txt

If I issue 'resources = sardine.getResources
("http://mywebdav/d/Transfer")', I get for the enumerated resources listing:

res.getName() -&gt; Transfer, Transfer/file1.txt, Transfer/file2.txt

I would expect for getName() -> file1.txt, file2.txt.
'Transfer' belongs to the dir above.

If I issue 'sardine.getResources ("http://mywebdav/d/Transfer/")' with a
'/' at the end to indicate a directory,
I get java.lang.StringIndexOutOfBoundsException: String index out of range: -1

Original issue: http://code.google.com/p/sardine/issues/detail?id=30

getResources Exception - Failed to get resources

Original author: [email protected] (March 22, 2010 22:26:53)

What steps will reproduce the problem?

  1. Trying a basic application (from the examples) which makes a call to
    getResources function
    2.
    3.

What is the expected output? What do you see instead?
When I make a call to sardine.getResources , instead of returning a List of
DavResources it throws an exception:
com.googlecode.sardine.util.SardineException: Failed to get resources. Is
the url valid?
at com.googlecode.sardine.SardineImpl.getResources(SardineImpl.java:127)

What version of the product are you using? On what operating system?
sardine-97 on Windows 7

Please provide any additional information below.
The program is minimal:
this.sardine = SardineFactory.begin("user", "pass");
List<DavResource> resources =
this.sardine.getResources("http://192.168.1.1/dav/test/");

On the same URL, I tried the exists function and it works fine (which means
that the URL is valid, and the credentials are correct)

Original issue: http://code.google.com/p/sardine/issues/detail?id=39

All the SardineFactory#begin(*, HttpRoutePlanner), doesn't uses HttpRoutePlanner

Original author: [email protected] (March 29, 2010 08:18:07)

What steps will reproduce the problem?
Use function "begin" with HttpRoutePlanner as parameter

What is the expected output? What do you see instead?
The correct response.
Connection reset by peer

What version of the product are you using?
Downloaded from SVN.

Please provide any additional information below (including code examples
and full stack traces with line numbers in them).

Inspecting the source code, the calling from SardineFactory static methods,
doesn't put the routeplanner as parameter of the Factory.instance().begin()

Original issue: http://code.google.com/p/sardine/issues/detail?id=41

doesResourceExist ?

Original author: [email protected] (January 07, 2010 21:00:17)

Firstly, nice project. Almost just what I need.

When directory browsing is off, can't easily identify if a file exists
without having expense of retrieving it.

suggest something like:

public boolean doesResourceExist(String url) throws 

SardineException
{
HttpGet get = new HttpGet(url);

    HttpResponse response = this.executeWrapper(get);

    StatusLine statusLine = response.getStatusLine();
    return SardineUtil.isGoodResponse(statusLine.getStatusCode

());
}

Note this only works for Files, not folders. Not sure if you want to
support this somehow or maybe just change the method name from
doesresourceexist to doesfileexist ??

I'm planning on swapping out some FTP connects with WebDAV, hence looking
for some like for like.

thanks

Original issue: http://code.google.com/p/sardine/issues/detail?id=14

sardine.getResources() returns corrupted strings

Original author: [email protected] (March 25, 2010 16:49:21)

What steps will reproduce the problem?
sardine.getResources() to get a directory listing then print the
DavResource's returned.

What is the expected output? What do you see instead?
The correct path and filename. Part of the root path is inserted after
the root path. (See example below.)

What version of the product are you using?
103

On what operating system?
Windows XP

What webdav server are you hitting?
IIS 6

What is in the server error logs?
N/A

Please provide any additional information below (including code examples
and full stack traces with line numbers in them).

Folder to list "http://www.Verasonics.com/VerasonicsWebDav/".

sardine.getResources returned:
daveResources.toString(): [DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Fri Jan 07 11:14:19 PST 2005, modified=Thu Mar
25 07:56:53 PDT 2010, name=ics.com/VerasonicsWebDav,
nameDecoded=ics.com/VerasonicsWebDav, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav,
isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=210,
contentType=null, creation=Tue Aug 21 13:38:58 PDT 2007, modified=Wed Oct
03 20:56:39 PDT 2007, name=ics.com/VerasonicsWebDav/.project,
nameDecoded=ics.com/VerasonicsWebDav/.project, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/.proje
ct, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Tue Dec 08 12:26:23 PST 2009, modified=Fri Mar
19 15:33:41 PDT 2010, name=ics.com/VerasonicsWebDav/.svn,
nameDecoded=ics.com/VerasonicsWebDav/.svn, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/.svn,
isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Mon Nov 12 07:54:49 PST 2007, modified=Thu Mar
11 10:32:32 PST 2010, name=ics.com/VerasonicsWebDav/Administrative,
nameDecoded=ics.com/VerasonicsWebDav/Administrative, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Admini
strative, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Tue Jul 15 13:04:28 PDT 2008, modified=Tue Jan
12 11:00:17 PST 2010, name=ics.com/VerasonicsWebDav/CustomerDownloads-
AnyCustomer, nameDecoded=ics.com/VerasonicsWebDav/CustomerDownloads-
AnyCustomer, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Custom
erDownloads-AnyCustomer, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Mon Dec 01 08:00:17 PST 2008, modified=Wed Mar
24 20:42:44 PDT 2010, name=ics.com/VerasonicsWebDav/CustomerDownloads-
TargetedCustomer, nameDecoded=ics.com/VerasonicsWebDav/CustomerDownloads-
TargetedCustomer, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Custom
erDownloads-TargetedCustomer, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Mon Jul 14 15:01:23 PDT 2008, modified=Tue Oct
14 15:47:17 PDT 2008,
name=ics.com/VerasonicsWebDav/CustomerVisibleForReleases,
nameDecoded=ics.com/VerasonicsWebDav/CustomerVisibleForReleases,
getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Custom
erVisibleForReleases, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Tue Aug 21 13:33:43 PDT 2007, modified=Wed Mar
17 17:02:46 PDT 2010, name=ics.com/VerasonicsWebDav/Developer,
nameDecoded=ics.com/VerasonicsWebDav/Developer, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Develo
per, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Sun Dec 18 10:34:38 PST 2005, modified=Thu Mar
25 07:56:55 PDT 2010, name=ics.com/VerasonicsWebDav/For%20Someone,
nameDecoded=ics.com/VerasonicsWebDav/For Someone, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/For%
20Someone, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=355,
contentType=null, creation=Tue Aug 21 13:39:29 PDT 2007, modified=Tue Apr
03 20:26:23 PDT 2007, name=ics.com/VerasonicsWebDav/index.htm,
nameDecoded=ics.com/VerasonicsWebDav/index.htm, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/index.
htm, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Wed Jan 16 14:14:36 PST 2008, modified=Thu Jan
14 16:34:15 PST 2010, name=ics.com/VerasonicsWebDav/Licensing,
nameDecoded=ics.com/VerasonicsWebDav/Licensing, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Licens
ing, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Tue Oct 28 13:47:16 PDT 2008, modified=Tue Dec
08 13:11:19 PST 2009, name=ics.com/VerasonicsWebDav/Market%20Place,
nameDecoded=ics.com/VerasonicsWebDav/Market Place, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Market
%20Place, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Mon Dec 01 14:03:10 PST 2008, modified=Thu Jan
22 23:58:04 PST 2009, name=ics.com/VerasonicsWebDav/PartnerDownloads-
AnyPartner, nameDecoded=ics.com/VerasonicsWebDav/PartnerDownloads-
AnyPartner, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Partne
rDownloads-AnyPartner, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Mon Dec 01 14:07:26 PST 2008, modified=Mon Dec
01 14:03:01 PST 2008, name=ics.com/VerasonicsWebDav/PartnerDownloads-
TargetedPartner, nameDecoded=ics.com/VerasonicsWebDav/PartnerDownloads-
TargetedPartner, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Partne
rDownloads-TargetedPartner, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Sat Sep 30 11:21:23 PDT 2006, modified=Thu Feb
04 10:16:55 PST 2010, name=ics.com/VerasonicsWebDav/Production%20Plan,
nameDecoded=ics.com/VerasonicsWebDav/Production Plan, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Produc
tion%20Plan, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=397,
contentType=null, creation=Tue Aug 21 13:38:58 PDT 2007, modified=Wed Jan
31 09:55:33 PST 2007, name=ics.com/VerasonicsWebDav/ReadMe.txt,
nameDecoded=ics.com/VerasonicsWebDav/ReadMe.txt, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/ReadMe
.txt, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Sun Dec 18 10:03:00 PST 2005, modified=Sat Sep
13 23:10:50 PDT 2008, name=ics.com/VerasonicsWebDav/Schedules,
nameDecoded=ics.com/VerasonicsWebDav/Schedules, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Schedu
les, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Thu Jan 28 14:52:57 PST 2010, modified=Thu Jan
28 14:49:35 PST 2010, name=ics.com/VerasonicsWebDav/SSI%20Project%20on%
20TMI%20server, nameDecoded=ics.com/VerasonicsWebDav/SSI Project on TMI
server, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/SSI%
20Project%20on%20TMI%20server, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Tue Aug 21 13:33:57 PDT 2007, modified=Tue Dec
08 13:51:09 PST 2009, name=ics.com/VerasonicsWebDav/Support,
nameDecoded=ics.com/VerasonicsWebDav/Support, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/Suppor
t, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Fri May 16 13:09:25 PDT 2008, modified=Wed Mar
17 10:19:43 PDT 2010, name=ics.com/VerasonicsWebDav/System%20Tracking,
nameDecoded=ics.com/VerasonicsWebDav/System Tracking, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/System
%20Tracking, isDirectory()=false], DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Tue Aug 21 13:45:25 PDT 2007, modified=Tue Dec
08 13:48:54 PST 2009, name=ics.com/VerasonicsWebDav/User%20Home%20Folders,
nameDecoded=ics.com/VerasonicsWebDav/User Home Folders, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/User%
20Home%20Folders, isDirectory()=false]]

First item in returned array was the folder itself. I DON'T THINK THE
FOLDER ITSELF SHOULD BE RETURNED:
davResoruce.getAbsoluteUrl():
http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav
davResource.getBaseUrl(): http://www.Verasonics.com/VerasonicsWebDav/
davResource.getName(): ics.com/VerasonicsWebDav
davResource.getNameDecoded(): ics.com/VerasonicsWebDav
davResource.toString(): DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Fri Jan 07 11:14:19 PST 2005, modified=Thu Mar
25 07:56:53 PDT 2010, name=ics.com/VerasonicsWebDav,
nameDecoded=ics.com/VerasonicsWebDav, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav,
isDirectory()=false]

Second item in returned array:
davResource.toString(): DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=0,
contentType=null, creation=Fri Jan 07 11:14:19 PST 2005, modified=Thu Mar
25 07:56:53 PDT 2010, name=ics.com/VerasonicsWebDav,
nameDecoded=ics.com/VerasonicsWebDav, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav,
isDirectory()=false]
davResoruce.getAbsoluteUrl():
http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/.projec
t
davResource.getBaseUrl(): http://www.Verasonics.com/VerasonicsWebDav/
davResource.getName(): ics.com/VerasonicsWebDav/.project
davResource.getNameDecoded(): ics.com/VerasonicsWebDav/.project
davResource.toString(): DavResource
[baseUrl=http://www.Verasonics.com/VerasonicsWebDav/, contentLength=210,
contentType=null, creation=Tue Aug 21 13:38:58 PDT 2007, modified=Wed Oct
03 20:56:39 PDT 2007, name=ics.com/VerasonicsWebDav/.project,
nameDecoded=ics.com/VerasonicsWebDav/.project, getAbsoluteUrl()
=http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/.proje
ct, isDirectory()=false]

My application wants to turn the DavResource into a URL via
myUrl = new URL(davResource.getAbsoluteUrl());
System.out.println("### " + myUrl);
Here is the output:

http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav

http://www.Verasonics.com/VerasonicsWebDav/ics.com/VerasonicsWebDav/.projec
t

The expected output is:

http://www.Verasonics.com/VerasonicsWebDav/.project

Original issue: http://code.google.com/p/sardine/issues/detail?id=40

[Improvement] Tolerate wrong Responses asking for collections

Original author: [email protected] (March 29, 2010 10:03:21)

What steps will reproduce the problem?
I'm using a german freemail provider that offers a "smart-drive" with
Webdav capability. Unfortunately this provider doesn't handle requests to
collections properly. If I'm asking for http://host/directory/ and I'll get
back http://host/directory (without the last-slash) This will throw an
StringIndexOutofBoundException in the SardineImpl. This is not a bug of
sardine (since the server does not act like described in rfc4918 section 5.2)

What is the expected output? What do you see instead?
I think sardine should tolerate this.

What version of the product are you using?
103

On what operating system?
irrelevant

What webdav server are you hitting?
https://webdav.smartdrive.web.de/ (Software unknown)

What is in the server error logs?

Please provide any additional information below (including code examples
and full stack traces with line numbers in them).
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at java.lang.String.substring(Unknown Source)
at com.googlecode.sardine.SardineImpl.getResources(SardineImpl.java:157)
at
org.remus.infomngmnt.connector.webdav.WebDAVConnector.getResourceFromUrl(WebDAVConnector.java:502)
at
org.remus.infomngmnt.connector.webdav.WebDAVConnector.addToRepository(WebDAVConnector.java:161)
at
org.remus.infomngmnt.core.remote.sync.ChangeSetExecutor.addRemoteInfoUnit(ChangeSetExecutor.java:518)
at
org.remus.infomngmnt.core.remote.sync.ChangeSetExecutor.synchronize(ChangeSetExecutor.java:336)
at
org.remus.infomngmnt.ui.remote.handler.SynchronizeCategoryHandler$2.doRun(SynchronizeCategoryHandler.java:136)
at
org.remus.infomngmnt.core.remote.sync.AbstractSynchronizationJob.run(AbstractSynchronizationJob.java:51)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

Original issue: http://code.google.com/p/sardine/issues/detail?id=42

HTTP errors should be stated in exception message

Original author: [email protected] (April 07, 2010 09:49:18)

currently the HTTP error code is not mentioned and one has to have a look
at the server side logs (if one is able to). This is really bad for
debugging and monitoring :-(

e.g.

satisfying: "Caused by: com.googlecode.sardine.util.SardineException: The
server has returned an HTTP error: 404"

better: "Caused by: com.googlecode.sardine.util.SardineException: The
server has returned an HTTP error: 404: page not found"

instead of: "Caused by: com.googlecode.sardine.util.SardineException: The
server has returned an HTTP error"

a detailed error example:
Caused by: com.googlecode.sardine.util.SardineException: The server has
returned an HTTP error
at com.googlecode.sardine.SardineImpl.createDirectory(SardineImpl.java:332)
at
aspicon.obs2conf.model.InfrastructureManager.createCustomerInfrastructure(InfrastructureManager.java:79)
... 52 more

other conditions could be that on directory creation a dir may already
exist etc.

Original issue: http://code.google.com/p/sardine/issues/detail?id=47

Trailing / on a server that doesn't have the host in it...

Original author: [email protected] (April 01, 2010 15:58:12)

Currently in the SardineImpl on line 164 it's checking for a trailing / but
only if the HREF starts with the hostPart.... I'm connecting to liferays CMS
and it doesn't return the trailing / and doesn't have the host part... to fix
my issue i mode the check for trailing to about the check for host part.. do
you think that will work accross the board?

Moved
if ((href.length() == baseUrl.length() - 1) && baseUrl.endsWith("/"))
{
href += "/";
}
Above
if (href.startsWith(hostPart))

Original issue: http://code.google.com/p/sardine/issues/detail?id=46

blanks and special chars in sardine.put() method.

Original author: [email protected] (March 11, 2010 12:44:34)

V.9.7

  1. a blank in remote adr:
    sardine.put("https:/mydavserver/a file with some blanks.txt",new
    FileInputStream ...)

Crashes with excpt.: "Illegal character in path at index ..."

  1. if remote adr encoded before:
    sardine.put(SardineUtil.encode("https://sd2dav.1und1.de/Transfer/test
    dokument.txt"),

Exception in thread "main" java.lang.IllegalStateException: Target host
must not be null, or set in parameters.
at
org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:651)
at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:353)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
at com.googlecode.sardine.SardineImpl.executeWrapper(SardineImpl.java:367)
at com.googlecode.sardine.SardineImpl.put(SardineImpl.java:266)
at SardineUploadTest.main(SardineUploadTest.java:24)

Any way around this ?
Thx
/Gerd

Original issue: http://code.google.com/p/sardine/issues/detail?id=34

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.