我们正在尝试使用TIdHTTPServer组件为我们的软件编写更新服务器.目前我们正在提供一个XML文件,列出可用的更新及其文件版本等.当客户端程序找到更新版本时,它应该开始使用BITS下载它.
现在这是我们遇到问题的地方,我们的程序正在请求XML文件并看到有可用的更新.然后它创建一个BITS作业来下载它,但是BITS一直报告下载失败.我们可以使用相同的URL和IE/Firefox/Chrome下载文件.
所以我的问题:
TIdHTTPServer与BITS兼容吗?
我问这个,因为我发现有一些工作的下载要求.
BITS下载的HTTP要求
BITS支持HTTP和HTTPS下载和上传,并要求服务器支持HTTP/1.1协议.对于下载,HTTP服务器的Head方法必须返回文件大小,其Get方法必须支持Content-Range和Content-Length标头.因此,除非ASP,ISAPI或CGI脚本支持Content-Range和Content-Length标头,否则BITS仅传输静态文件内容并在尝试传输动态内容时生成错误.
BITS可以使用HTTP/1.0服务器,只要它符合Head和Get方法要求即可.
要支持下载文件范围,服务器必须支持以下要求:
允许MIME标头包含标准的Content-Range和Content-Type标头,以及最多180个字节的其他标头.在HTTP标头和第一个边界字符串之间最多允许两个CR/LF.
我正在学习JQuery Get方法.我启动了一个Python HTTP服务器:
(只需键入命令" Python -m SimpleHTTPServer ").
只需在我的网络浏览器上访问"http:// localhost:80"即可测试此网络服务器.但是,当我写这个非常简单的JavaScript来访问我的网络服务器.我收到一条错误消息:
"代码501,消息不支持的方法('OPTIONS')"
我使用jquery.xdomainajax.js库,假设跨域请求JQuery.
这是我的javascript代码:
<html>
<head>
<script src="jquery.min.js"></script>
<script src="jquery.xdomainajax.js"></script>
<script type="text/javascript">
$(document).ready(function(){
u = 'http://localhost:80';
jQuery.get(u, function(res){
$("#data").html(res.responseText)
});
});
</script>
</head>
<body>
<p id="data"></p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
实际上,如果我将您更改为任何其他网址,例如"http://www.google.ca".它运作得很好.但我不知道为什么它不适用于基本的Python HTTP服务器.谁能帮我?
我有简单的节点js http服务器.
var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
Run Code Online (Sandbox Code Playgroud)
如果我跑
node basicserver.js
Run Code Online (Sandbox Code Playgroud)
我明白了
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: listen EADDRINUSE
at errnoException (net.js:642:11)
at Array.0 (net.js:743:26)
at EventEmitter._tickCallback (node.js:192:40)
Run Code Online (Sandbox Code Playgroud)
我看过这篇文章,但该帖子似乎是特定于TCP服务器而不是http服务器.有谁可以帮忙.
我正在查看CocoaHTTPServer项目的源代码,更具体地说是HTTPServer.m文件,我只是不明白这一行:
connectionClass = [HTTPConnection self];
Run Code Online (Sandbox Code Playgroud)
这是做什么的(它在任何地方记录)?它甚至如何编译?不应该
connectionClass = [HTTPConnection class];
Run Code Online (Sandbox Code Playgroud) 在编写我的HTTP/1.1服务器时,我遇到了处理多个范围请求的问题.
RFC 2616的第14.35.1节引用了一些示例,但没有说明服务器行为.例如:
GET /some/resource HTTP/1.1
...
Range: bytes=200-400,100-300,500-600
...
Run Code Online (Sandbox Code Playgroud)
我应该返回这个确切的字节序列吗?或者我应该合并所有范围,发送100-400,500-600?或者在两者之间发送,100-600?
最糟糕的是,当检查Content-Range响应头(第14.16节)时,可能只返回一个范围,所以我想知道服务器如何响应第14.35.1节中的示例bytes=0-0,-1!
我的服务器应如何处理此类请求?
我想SimpleHTTPServer在一个单独的线程中启动一个,同时time.sleep(100)在主要的一个中执行其他操作(此处).以下是我的代码的简化示例:
from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import HTTPServer
server = HTTPServer(('', 8080), SimpleHTTPRequestHandler)
print 'OK UNTIL NOW'
thread = threading.Thread(target = server.serve_forever())
print 'STUCK HERE'
thread.setdaemon = True
try:
thread.start()
except KeyboardInterrupt:
server.shutdown()
sys.exit(0)
print 'OK'
time.sleep(120)
Run Code Online (Sandbox Code Playgroud)
但是,该线程仍然是"阻塞",即不作为守护进程启动,并且解释器无法到达print 'OK'.它既没有达到STUCK HERE.
我已经知道线程只会在调用时被初始化,threading.Thread(...)并且主线程仍然会更进一步,直到找到thread.start启动它的指令.
有没有更好的方法来完成这项任务?
我在Java中使用一个非常简单的httpServer来进行GET,POST,PUT和DELETE的api休息.我正在使用基本身份验证,我有几个类Authentication.java和Authorisation.java,我用它来验证和检查用户的权限.
所以,问题是我希望所有用户(经过身份验证)能够从我的api休息中获取信息,但只有具有某些特权的用户才能进行POST,PUT和DELETE.那我该怎么办呢?
这就是我得到的
public class Server {
private static HttpServer server;
public static void start() throws IOException {
server = HttpServer.create(new InetSocketAddress(8000), 0);
HttpContext ctx = server.createContext("/users", new UserHandler());
ctx.setAuthenticator(new ApiRestBasicAuthentication("users"));
server.start();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的ApiRestBasicAuthentication
public class ApiRestBasicAuthentication extends BasicAuthenticator {
private UserAuthentication authentication = new UserAuthentication();
public ApiRestBasicAuthentication(String realm) {
super(realm);
}
@Override
public boolean checkCredentials(String user, String pwd) {
int authCode = authentication.authenticate(user, pwd);
return authCode == UserAuthentication.USER_AUTHENTICATED;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,检查凭据仅检查用户是否经过身份验证.但我想检查一下,如果方法是POST,DELETE或PUT,我还应检查具体的凭据.但是如何在ApiRestBasicAuthentication中获取该方法?我在我的处理程序类中这样做
public void handle(HttpExchange httpExchange) throws IOException { …Run Code Online (Sandbox Code Playgroud) 我使用Sun Ws实现编写了一个Web服务服务器,并使用HttpsServer进行发布(TLS相互身份验证).
httpServer=HttpsServer.create(...);
ssl=SSLContext.getInstance("TLS");
...
ssl.init(keyFactory.getKeyManagers(),trustFactory.getTrustManagers(),new SecureRandom());
configurator=new HttpsConfigurator(ssl) {
public void configure (HttpsParameters params)
{
SSLContext context;
SSLParameters sslparams;
context=getSSLContext();
sslparams=context.getDefaultSSLParameters();
sslparams.setNeedClientAuth(true);
params.setSSLParameters(sslparams);
}
};
((HttpsServer)httpServer).setHttpsConfigurator(configurator);
...
endPoint=getSunWsProvider().createEndPoint(...);
httpContext=httpServer.createContext(...);
endPoint.publish(httpContext);
httpServer.start();
...
Run Code Online (Sandbox Code Playgroud)
一切正常.当客户端执行Web服务的服务器端实现时,我想知道哪个客户端正在执行代码(以管理权限).知道每个客户端都有自己的证书,如何在Web服务调用之前获取用于TLS协商的客户端证书?(我更愿意找到基于客户端证书分析的解决方案,而不是为每个Web服务调用添加标识信息).
谢谢您的帮助.
我已经使用Sun的轻量级HttpServer在线发现了一个简单的HttpServer.
基本上主要功能如下:
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
//Create the context for the server.
server.createContext("/", new BaseHandler());
server.setExecutor(null); // creates a default executor
server.start();
}
Run Code Online (Sandbox Code Playgroud)
我已经实现了BaseHandler接口的方法来处理Http请求并返回响应.
static class BaseHandler implements HttpHandler {
//Handler method
public void handle(HttpExchange t) throws IOException {
//Implementation of http request processing
//Read the request, get the parameters and print them
//in the console, then build a response and send it back.
}
}
Run Code Online (Sandbox Code Playgroud)
我还创建了一个通过线程发送多个请求的客户端.每个线程将以下请求发送到服务器:
HTTP://本地主机:8000/[上下文] INT ="+线程ID …
我使用 http 服务器托管本地文件。只需使用以下命令在我的 Mac HTTP 服务器上安装:
npm install --global http-server
Run Code Online (Sandbox Code Playgroud)
然后我使用以下命令在所需目录中启动该服务器:
http-server
Run Code Online (Sandbox Code Playgroud)
httpserver ×10
http ×3
java ×3
python ×2
certificate ×1
class ×1
class-method ×1
cors ×1
delphi ×1
http-1.1 ×1
indy ×1
javascript ×1
jquery ×1
macos ×1
node.js ×1
objective-c ×1
rest ×1
rfc2616 ×1
web-services ×1