blob: bbc1ac19c5cbab20d9b37fe20b764beec357250b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "utils.h"
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <getopt.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void
HttpDebugHeader(TSMBuffer mbuf, TSMLoc mhdr)
{
HttpIoBuffer iobuf;
int64_t nbytes;
int64_t avail;
const char *ptr;
TSIOBufferBlock blk;
TSHttpHdrPrint(mbuf, mhdr, iobuf.buffer);
blk = TSIOBufferReaderStart(iobuf.reader);
avail = TSIOBufferBlockReadAvail(blk, iobuf.reader);
ptr = TSIOBufferBlockReadStart(blk, iobuf.reader, &nbytes);
AuthLogDebug("http request (%u of %u bytes):\n%*.*s", (unsigned)nbytes, (unsigned)avail, (int)nbytes, (int)nbytes, ptr);
}
void
HttpSetMimeHeader(TSMBuffer mbuf, TSMLoc mhdr, const char *name, unsigned value)
{
TSMLoc mloc;
mloc = TSMimeHdrFieldFind(mbuf, mhdr, name, -1);
if (mloc == TS_NULL_MLOC) {
TSReleaseAssert(TSMimeHdrFieldCreateNamed(mbuf, mhdr, name, -1, &mloc) == TS_SUCCESS);
} else {
TSReleaseAssert(TSMimeHdrFieldValuesClear(mbuf, mhdr, mloc) == TS_SUCCESS);
}
TSReleaseAssert(TSMimeHdrFieldValueUintInsert(mbuf, mhdr, mloc, 0 /* index */, value) == TS_SUCCESS);
TSReleaseAssert(TSMimeHdrFieldAppend(mbuf, mhdr, mloc) == TS_SUCCESS);
TSHandleMLocRelease(mbuf, mhdr, mloc);
}
void
HttpSetMimeHeader(TSMBuffer mbuf, TSMLoc mhdr, const char *name, const char *value)
{
TSMLoc mloc;
mloc = TSMimeHdrFieldFind(mbuf, mhdr, name, -1);
if (mloc == TS_NULL_MLOC) {
TSReleaseAssert(TSMimeHdrFieldCreateNamed(mbuf, mhdr, name, -1, &mloc) == TS_SUCCESS);
} else {
TSReleaseAssert(TSMimeHdrFieldValuesClear(mbuf, mhdr, mloc) == TS_SUCCESS);
}
TSReleaseAssert(TSMimeHdrFieldValueStringInsert(mbuf, mhdr, mloc, 0 /* index */, value, -1) == TS_SUCCESS);
TSReleaseAssert(TSMimeHdrFieldAppend(mbuf, mhdr, mloc) == TS_SUCCESS);
TSHandleMLocRelease(mbuf, mhdr, mloc);
}
unsigned
HttpGetContentLength(TSMBuffer mbuf, TSMLoc mhdr)
{
TSMLoc mloc;
unsigned value = 0;
mloc = TSMimeHdrFieldFind(mbuf, mhdr, TS_MIME_FIELD_CONTENT_LENGTH, -1);
if (mloc != TS_NULL_MLOC) {
value = TSMimeHdrFieldValueUintGet(mbuf, mhdr, mloc, 0 /* index */);
}
TSHandleMLocRelease(mbuf, mhdr, mloc);
return value;
}
bool
HttpIsChunkedEncoding(TSMBuffer mbuf, TSMLoc mhdr)
{
TSMLoc mloc;
bool ischunked = false;
mloc = TSMimeHdrFieldFind(mbuf, mhdr, TS_MIME_FIELD_TRANSFER_ENCODING, -1);
if (mloc != TS_NULL_MLOC) {
const char *str;
int len;
str = TSMimeHdrFieldValueStringGet(mbuf, mhdr, mloc, -1 /* index */, &len);
if (str && len) {
ischunked = (strncmp("chunked", str, len) == 0);
}
}
TSHandleMLocRelease(mbuf, mhdr, mloc);
return ischunked;
}
// vim: set ts=4 sw=4 et :