[英]Proxy server - wrong encoding
我正在尝试编写简单的代理服务器(处理GET请求)。 我写了以下代码:
public void handle(Socket socket) throws IOException, URISyntaxException {
/* CLIENT -> SERVER */
Scanner clientInputScanner = new Scanner(socket.getInputStream());
List<String> clientHeaders = new ArrayList<String>();
String line;
String targetUrl = null;
boolean firstLine = true;
while ((line = clientInputScanner.nextLine()) != null) {
if (line.length() <= 0) {
break;
}
if (firstLine) {
String[] tokens = line.split(" ");
targetUrl = tokens[1];
line = tokens[0] + " " + this.extractPath(tokens[1]) + " " + tokens[2];
firstLine = false;
}
clientHeaders.add(line);
}
Socket server = new Socket(this.extractHostName(targetUrl), 80);
PrintWriter serverPrint = new PrintWriter(server.getOutputStream());
for (String header: clientHeaders) {
serverPrint.println(header);
}
serverPrint.println("");
serverPrint.flush();
/* SERVER -> CLIENT */
Scanner serverScanner = new Scanner(server.getInputStream());
PrintWriter clientPrinter = new PrintWriter(socket.getOutputStream());
List<String> serverHeaders = new ArrayList<String>();
int serverContentLength = 0;
while ((line = serverScanner.nextLine()) != null) {
if (line.length() <= 0) {
break;
}
serverHeaders.add(line);
if (line.startsWith("Content-Length: ")) {
// content-length
int index = line.indexOf(':') + 1;
String len = line.substring(index).trim();
serverContentLength = Integer.parseInt(len);
}
}
for (String header: serverHeaders) {
clientPrinter.println(header);
}
clientPrinter.println("");
clientPrinter.flush();
if (serverContentLength > 0) {
InputStream serverReader = server.getInputStream();
OutputStream clientWriter = socket.getOutputStream();
byte[] buff = new byte[1024];
int bytesRead;
int count = 0;
while ((bytesRead = serverReader.read(buff)) != -1) {
if (count == serverContentLength) {
break;
}
clientWriter.write(buff, 0, bytesRead);
clientWriter.flush();
count += bytesRead;
}
clientWriter.close();
serverReader.close();
}
clientInputScanner.close();
}
问题是编码-webbrowser无法理解正文请求(显示奇怪的字符) 。 我正在传递原始字节(没有将其解释为字符),所以不知道有什么问题。 Content-Type标头正确传递(具有良好的编码)
注意:这仅仅是POC的代码,我只需要使它工作即可。 所以,代码风格很难看:)
扫描程序将读取整个缓冲区中的数据。 它不会在当前行的末尾停止读取。 因此,扫描程序将已经从您的身体读取了数据-当您执行InputStream serverReader = server.getInputStream();
的那一刻InputStream serverReader = server.getInputStream();
,来自人体的一些(或全部)数据已被扫描仪消耗。
您将必须坚持从套接字读取的一个类,并且由于要读取二进制数据,因此必须是普通的InputStream
。 无法使用BufferedReader
和Scanner
因为它们将读取行尾以外的缓冲区
您可以在InputStream
上实现自己的readLine方法-只要看到行尾时就停止读取,其余数据仍将在那里供您作为主体的一部分使用。
这可能会或可能不会解释奇怪的字符 -我们需要确定您要发送的数据以及如何查看数据才能确定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.