Как обрабатывать поток запроса тела POST клиента с использованием заголовка Expect: 100-continue? - PullRequest
0 голосов
/ 01 августа 2020

Я нетерпеливый ученик

Я ищу информацию о том, как контролировать поток данных между клиентом и сервером таким образом:

я хочу, клиент отправляет POST запроса вместе с заголовком Expect: 100-continue, затем сервер обрабатывает заголовки и проверяет информацию о сеансе, если все в порядке, сервер отправляет код состояния ответа 100 и, наконец, клиент отправляет тело запроса.

я сомневаюсь не в проверке заголовков, а в том, как регулировать поток данных тела POST запроса клиента на сервер, если результат проверки не является ожидаемым отклонением запроса и ответом состояния ошибки запроса клиента

если есть ли способ это сделать, как правильно сделать? Я не говорю по-английски sh изначально извиняюсь за любую ошибку, спасибо за помощь.

1 Ответ

1 голос
/ 06 августа 2020

Вот пример с узлом 12:

// server.js
const http = require('http')

// This is executed only when the client send a request without the `Expect` header or when we run `server.emit('request', req, res)`
const server = http.createServer((req, res) => {
  console.log('Handler')

  var received = 0
  req.on('data', (chunk) => { received += chunk.length })
  req.on('end', () => {
    res.writeHead(200, { 'Content-Type': 'text/plain' })
    res.write('Received ' + received)
    res.end()
  })
})

// this is emitted whenever the client send the `Expect` header
server.on('checkContinue', (req, res) => {
  console.log('checkContinue')
  // do validation
  if (Math.random() <= 0.4) { // lucky
    res.writeHead(400, { 'Content-Type': 'text/plain' })
    res.end('oooops')
  } else {
    res.writeContinue()
    server.emit('request', req, res)
  }
})

server.listen(3000, '127.0.0.1', () => {
  const address = server.address().address
  const port = server.address().port
  console.log(`Started http://${address}:${port}`)
})

Клиент

// client.js
var http = require('http')

var options = {
  host: 'localhost',
  port: 3000,
  path: '/',
  method: 'POST',
  headers: { Expect: '100-continue' }
}

const req = http.request(options, (response) => {
  var str = ''
  response.on('data', function (chunk) {
    str += chunk
  })

  response.on('end', function () {
    console.log('End: ' + str)
  })
})

// event received when the server executes `res.writeContinue()`
req.on('continue', function () {
  console.log('continue')
  req.write('hello'.repeat(10000))
  req.end()
})
...