package aQute.maven.provider;
import java.io.File;
import java.net.HttpURLConnection;
import java.text.ParseException;
import java.util.Date;
import aQute.bnd.http.HttpClient;
import aQute.http.testservers.Httpbin;
import aQute.lib.io.IO;
import aQute.libg.cryptography.SHA1;
public class FakeNexus extends Httpbin {
private File base;
public FakeNexus(Config config, File base) throws Exception {
super(config);
this.base = base;
}
public File _repo(Request rq, Response rsp) throws Exception {
try {
String path = rq.uri.getPath();
if (!path.startsWith("/repo/")) {
rsp.code = HttpURLConnection.HTTP_BAD_REQUEST;
return null;
}
path = path.substring(6);
System.out.println(rq.method + " " + path);
File f = IO.getFile(base, path);
switch (rq.method) {
case "GET" :
if (!f.isFile()) {
rsp.code = HttpURLConnection.HTTP_NOT_FOUND;
System.out.println(rq.method + " " + path + " not found");
return null;
}
if (rq.headers.containsKey("if-modified-since")) {
long l = fromHttpDate(rq.headers.get("if-modified-since"));
if (f.lastModified() <= l) {
rsp.code = HttpURLConnection.HTTP_NOT_MODIFIED;
return null;
}
}
if (rq.headers.containsKey("if-none-match")) {
String etag = rq.headers.get("if-none-match");
if (etag.equals(SHA1.digest(f).asHex())) {
rsp.code = HttpURLConnection.HTTP_NOT_MODIFIED;
return null;
}
}
rsp.headers.put("Last-Modified", totHttpDate(f.lastModified()));
rsp.headers.put("ETag", SHA1.digest(f).asHex());
return f;
case "PUT" :
if (rq.headers.containsKey("if-match") && f.isFile()) {
System.out.println("if-match" + rq.headers.get("if-match"));
String etag = rq.headers.get("if-match");
if (!etag.equals(SHA1.digest(f).asHex())) {
rsp.code = HttpURLConnection.HTTP_PRECON_FAILED;
return null;
}
}
if (rq.headers.containsKey("if-unmodified-since")) {
long l = fromHttpDate(rq.headers.get("if-unmodified-since"));
System.out.println("if-unmodified-since h=" + l + " f=" + f.lastModified());
if (f.isFile() && f.lastModified() > l) {
rsp.code = HttpURLConnection.HTTP_PRECON_FAILED;
return null;
}
}
f.getParentFile().mkdirs();
IO.copy(rq.content, f);
rsp.headers.put("Last-Modified", totHttpDate(f.lastModified()));
rsp.headers.put("ETag", SHA1.digest(f).asHex());
rsp.code = 201;
return f;
case "DELETE" :
if (!f.isFile()) {
rsp.code = HttpURLConnection.HTTP_NOT_FOUND;
return null;
}
IO.delete(f);
rsp.code = 200;
return null;
default :
System.out.println("OOPS");
rsp.code = HttpURLConnection.HTTP_BAD_REQUEST;
return null;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("exit");
}
return null;
}
private String totHttpDate(long lastModified) {
return HttpClient.sdf.format(new Date(lastModified));
}
private long fromHttpDate(String string) throws ParseException {
return HttpClient.sdf.parse(string).getTime();
}
}