smgc commited on
Commit
15ca1e9
1 Parent(s): 7ffd2b8

Update app.js

Browse files
Files changed (1) hide show
  1. app.js +40 -19
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
- const buffer = await response.buffer();
156
- console.log('Response body length:', buffer.length);
 
 
157
 
158
- let data;
159
- if (contentEncoding === 'gzip') {
160
- // 检查是否已经是JSON格式
161
- if (buffer.toString().trim().startsWith('{')) {
162
- console.log('Response appears to be JSON despite gzip header. Using as-is.');
163
- data = buffer;
164
- } else {
165
- try {
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
- data = buffer;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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);