Spaces:
Running
Running
Update app.js
Browse files
app.js
CHANGED
@@ -148,33 +148,54 @@ async function handleRequest(req, res) {
|
|
148 |
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
|
149 |
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, x-api-key, anthropic-version, model');
|
150 |
|
|
|
151 |
const contentEncoding = response.headers.get('content-encoding');
|
|
|
152 |
console.log('Content-Encoding:', contentEncoding);
|
153 |
|
154 |
-
|
155 |
-
|
156 |
-
|
|
|
|
|
157 |
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
data = await gunzip(buffer);
|
167 |
-
} catch (error) {
|
168 |
-
console.error('Gunzip error:', error);
|
169 |
-
console.log('First 100 bytes of response:', buffer.slice(0, 100).toString('hex'));
|
170 |
-
throw new Error('Failed to decompress the response');
|
171 |
-
}
|
172 |
}
|
|
|
|
|
173 |
} else {
|
174 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
175 |
}
|
176 |
|
177 |
-
res.send(data);
|
178 |
logRequest(req, response.status, `Request forwarded successfully for model: ${model}`);
|
179 |
} catch (error) {
|
180 |
console.error('Request error:', error);
|
|
|
148 |
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
|
149 |
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, x-api-key, anthropic-version, model');
|
150 |
|
151 |
+
const contentType = response.headers.get('content-type');
|
152 |
const contentEncoding = response.headers.get('content-encoding');
|
153 |
+
console.log('Content-Type:', contentType);
|
154 |
console.log('Content-Encoding:', contentEncoding);
|
155 |
|
156 |
+
if (contentType && contentType.includes('text/event-stream')) {
|
157 |
+
// 处理 SSE
|
158 |
+
res.setHeader('Content-Type', 'text/event-stream');
|
159 |
+
res.setHeader('Cache-Control', 'no-cache');
|
160 |
+
res.setHeader('Connection', 'keep-alive');
|
161 |
|
162 |
+
const reader = response.body.getReader();
|
163 |
+
const decoder = new TextDecoder();
|
164 |
+
|
165 |
+
while (true) {
|
166 |
+
const { done, value } = await reader.read();
|
167 |
+
if (done) break;
|
168 |
+
const chunk = decoder.decode(value, { stream: true });
|
169 |
+
res.write(chunk);
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
}
|
171 |
+
|
172 |
+
res.end();
|
173 |
} else {
|
174 |
+
// 非流式响应的处理
|
175 |
+
const buffer = await response.buffer();
|
176 |
+
console.log('Response body length:', buffer.length);
|
177 |
+
|
178 |
+
let data;
|
179 |
+
if (contentEncoding === 'gzip') {
|
180 |
+
if (buffer.toString().trim().startsWith('{') || buffer.toString().trim().startsWith('event:')) {
|
181 |
+
console.log('Response appears to be JSON or SSE despite gzip header. Using as-is.');
|
182 |
+
data = buffer;
|
183 |
+
} else {
|
184 |
+
try {
|
185 |
+
data = await gunzip(buffer);
|
186 |
+
} catch (error) {
|
187 |
+
console.error('Gunzip error:', error);
|
188 |
+
console.log('First 100 bytes of response:', buffer.slice(0, 100).toString('hex'));
|
189 |
+
throw new Error('Failed to decompress the response');
|
190 |
+
}
|
191 |
+
}
|
192 |
+
} else {
|
193 |
+
data = buffer;
|
194 |
+
}
|
195 |
+
|
196 |
+
res.send(data);
|
197 |
}
|
198 |
|
|
|
199 |
logRequest(req, response.status, `Request forwarded successfully for model: ${model}`);
|
200 |
} catch (error) {
|
201 |
console.error('Request error:', error);
|