0cff5065d9
* add skeleton and broken http client code. GET returns "Resource temporarily unavailable" errors... * linux compile fix * can GET some pages * Update formatting in README.md * unittest for sending large messages * document bug * Feature/send large message (#14) * introduce send fragment * can pass a fin frame * can send messages which are a perfect multiple of the chunk size * set fin only for last fragment * cleanup * last fragment should be of type CONTINUATION * Add simple send and receive programs * speedups receiving + better way to wait for thing * receive speedup by using linked list of chunks instead of large array * document bug * use chunks to receive data * trailing spaces * Update README.md Add note about message fragmentation. * Feature/ws cli (#15) * New command line tool for transfering files / still very beta. * add readme * use cli11 for argument parsing * json -> msgpack * stop using base64 and use binary which can be stored in message pack * add target for building with homebrew * all CMakeLists are referenced by the top level one * add ws_chat and ws_connect sub commands to ws * cleanup * add echo and broadcast server as ws sub-commands * add gitignore * comments * ping pong added to ws * mv cobra_publisher under ws folder * Update README.md * linux build fix * linux build fix * move http_client to a ws sub-command * simple HTTP post support (urlencode parameters) * can specify extra headers * chunk encoding / simple redirect support / -I option * follow redirects is optional * make README vim markdown plugin friendly * cleanup argument parsing + add socket creation factory * add missing file * http gzip compression * cleanup * doc * Feature/send large message (#14) * introduce send fragment * can pass a fin frame * can send messages which are a perfect multiple of the chunk size * set fin only for last fragment * cleanup * last fragment should be of type CONTINUATION * Add simple send and receive programs * speedups receiving + better way to wait for thing * receive speedup by using linked list of chunks instead of large array * document bug * use chunks to receive data * trailing spaces
67 lines
1.9 KiB
C++
67 lines
1.9 KiB
C++
/*
|
|
* IXWebSocketHttpHeaders.h
|
|
* Author: Benjamin Sergeant
|
|
* Copyright (c) 2018 Machine Zone, Inc. All rights reserved.
|
|
*/
|
|
|
|
#include "IXWebSocketHttpHeaders.h"
|
|
#include "IXSocket.h"
|
|
|
|
#include <string>
|
|
#include <unordered_map>
|
|
|
|
namespace ix
|
|
{
|
|
std::pair<bool, WebSocketHttpHeaders> parseHttpHeaders(
|
|
std::shared_ptr<Socket> socket,
|
|
const CancellationRequest& isCancellationRequested)
|
|
{
|
|
WebSocketHttpHeaders headers;
|
|
|
|
char line[1024];
|
|
int i;
|
|
|
|
while (true)
|
|
{
|
|
int colon = 0;
|
|
|
|
for (i = 0;
|
|
i < 2 || (i < 1023 && line[i-2] != '\r' && line[i-1] != '\n');
|
|
++i)
|
|
{
|
|
if (!socket->readByte(line+i, isCancellationRequested))
|
|
{
|
|
return std::make_pair(false, headers);
|
|
}
|
|
|
|
if (line[i] == ':' && colon == 0)
|
|
{
|
|
colon = i;
|
|
}
|
|
}
|
|
if (line[0] == '\r' && line[1] == '\n')
|
|
{
|
|
break;
|
|
}
|
|
|
|
// line is a single header entry. split by ':', and add it to our
|
|
// header map. ignore lines with no colon.
|
|
if (colon > 0)
|
|
{
|
|
line[i] = '\0';
|
|
std::string lineStr(line);
|
|
// colon is ':', colon+1 is ' ', colon+2 is the start of the value.
|
|
// i is end of string (\0), i-colon is length of string minus key;
|
|
// subtract 1 for '\0', 1 for '\n', 1 for '\r',
|
|
// 1 for the ' ' after the ':', and total is -4
|
|
std::string name(lineStr.substr(0, colon));
|
|
std::string value(lineStr.substr(colon + 2, i - colon - 4));
|
|
|
|
headers[name] = value;
|
|
}
|
|
}
|
|
|
|
return std::make_pair(true, headers);
|
|
}
|
|
}
|