# 看书
网络库
mysql++
Linux_UNIX系统编程手册(上)
Redis设计与实现(完整版)-黄健宏
GDB调试
effective C++
剑指offer
# http学习
[菜鸟教程](<https://www.runoob.com/http/http-tutorial.html>)
HyperText Transfer Protocol,超文本传输协议
因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
基于**TCP/IP通信协议**来传递数据(HTML 文件, 图片文件, 查询结果等)。
## html文件/语言?
[超文本](<https://www.w3school.com.cn/tags/tag_term_hypertext.asp>)
## xml格式?
# httplib库
# cmake
cmake支持嵌套!
设置include来保证找库的路径对
记得常见的内置参数
链接动态库link library
# c++ primer
“”在当前目录下找,<>在库目录下找(用cmakelist规定)
using namespace尽量不要写在h文件中,具体见《Effective C++》
# curl命令
```shell
curl -v -X GET 0.0.0.0:1234
```
# 正则表达式
# 将ecos代码跑起来,明确自己改哪里的代码
参照文档把请求头写好,元素写好(明确写头和元素的函数)
中间解析xml的部分略写,之后交由元元负责
中间处理的过程略写,之后交由师兄负责
参照文档把需要测试的响应用string表示出来直接返回,看curl命令和s3cmd是否都能通过
整理成文档发给师兄和元元
问题:
1. ecos程序编译出错
将`build`目录下所有内容删除,将`AMQP`里的`CMakeLists.txt`里`option(AMQP-CPP_LINUX_TCP "Build linux sockets implementation." ON)`中的`OFF`改成`ON`,再重新cmake编译
2. `set_content`没有生效?返回信息为空
读取文件中字符串的函数内容有错
```c++
//临时读文件字符串,rapidxml后删除
#include <stdio.h>
#include <stdlib.h>
string ReadTxt(string filename){
ifstream in(filename);
string readLine;
string result;
if(in){
while (getline(in,readLine))//这里读取的是每一行
{
result.append(readLine);//要把读取的每一行写到result里去
}
}
else{
cout<<"no such file"<<endl;
}
return result;
}
```
3. s3cmd发送的信息比字面上的要多,这些是否也要设置进接口中
自由选取
4. 很多格式和官方文档的不同,比如日期
按照实际的来
5. 日期的显示有点奇怪
`Tue, 20 Aug 2019 10:16:46 +000`
交由师兄封装
Mon就是monday的缩写,也就是星期一,
Sep是sertember的缩写,九月
+0800也就是时差,这里表示在中国北京或者同纬度上的时间
CST =Central Standard Time (美国)中部标准时间
6. Authorization:放一个字符串?如何设计?时间戳+密钥+私钥等等?
暂时随便放个什么
7. `Request Parameters`&`URL`
例如`https://www.baidu.com/s?ie=UTF-8&wd=Request%20Parameters`中`ie=UTF-8`,`wd=Request`都是请求参数,URL则是`/`后面的东西。
状态行`DELETE /ObjectName HTTP/1.1`里的`ObjectName`就是`URL`
8. `x-amz-content-sha256`
9. `x-amz-date`的格式在不同命令里不一样,怎么办?是否是因为s3cmd本身的问题?使用`curl`直接请求s3用`Tue, 20 Aug 2019 10:16:46 +000`格式成功
10. `PUTBucket`操作中的`Authorization`很奇怪
------
11. `R"(/w+/)"`无法匹配
正确写法`R"(/(\w+)/)"`,里面的`(\w+)`整体用`\`+括号来匹配
12.
# 修改s3cmd配置文件,利用s3cmd进行测试
~/.s3cfg
```shell
[default]
access_key = "AKIAX4SGBFHBY7F6646P"
secret_key = "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"
host_base = s3.amazonaws.com
host_bucket = testBucket1.s3.amazonaws.com
use_https = False
```
```shell
[default]
access_key = "AKIAX4SGBFHBY7F6646P"
secret_key = "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"
host_base = 127.0.0.1:9090
host_bucket = 127.0.0.1/testBucket1
use_https = False
```
操作
```shell
//1-1-GETService
s3cmd ls
//2-1-PUTBucket
s3cmd mb s3://testBucket1
//2-2-DELETEBucket
s3cmd rb s3://testBucket1
//2-3-GETBucket
s3cmd ls s3://testBucket1
//3-1-PUTObject
s3cmd put /home/smc/surfacetest/readFiles/uploadObject s3://testBucket1/testObject1
//3-2-DELETEObject
s3cmd del s3://testBucket1/uploadObject
//3-3-GETObject
s3cmd get s3://testBucket1/downloadObject /home/smc/downloadObject
//3-4-HEADobject
```
# URL
```
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。
编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如 空格的编码值是"%20"。
如果不使用转义字符,这些编码就会当URL中定义的特殊字符处理。
下表中列出了一些URL特殊符号及编码 十六进制值
1.+ URL 中+号表示空格 %2B
2.空格 URL中的空格可以用+号或者编码 %20
3./ 分隔目录和子目录 %2F
4.? 分隔实际的 URL 和参数 %3F
5.% 指定特殊字符 %25
6.# 表示书签 %23
7.& URL 中指定的参数间的分隔符 %26
8.= URL 中指定参数的值 %3D
```
# 文档中的词汇理解
key,其实就是文件系统中的文件名,包含了路径,在对象存储中叫key,用于分组
# gtest&gmok
https://www.cnblogs.com/coderzh/archive/2009/04/06/1426758.html
# 正式代码
按文档编译整个项目,最后一步是在`~/ecos-v2/build`目录下
```shell
make -j4 && ./bin/interface_server
```
改监听端口:`config_opts.cc`
遇到问题
```shell
no such file
>>testRes:
free(): invalid pointer
```
很明显是ReadTxt出问题,所以将文件路径修改即可,注意文件的根路径是执行该程序的路径,而非可执行程序所在路径
问题:
1. 格式问题√
2. 信息写到log文件里?打印?——不用打印
3. 空header接收问题——我只管接收,之后operation处理
4. 大量重复,变量问题——暂时不管以后优化
5. deletebuckect时出现xml解析错误的问题——已解决
6. get bucket里的响应,owner的类型怎么是string,其父元素为什么是ListBucketResult.Contents | CommonPrefixes——一个是文件,一个是文件夹
7. 非string类型,比如x-amz-storage-class是Enum类型的怎么接收——先用string接收
8. redirect重定向是什么意思——不需要
9. amazon和本地对etag的结果不一样
明文:`abc`
标准答案:amazon:`0bee89b07a248e27c83fc3d5951213c1`——md5sum
python:`e23230ae39386ea9be8cf37c00d956f8-1`——?
本地:`900150983cd24fb0d6963f7d28e17f72`——md5
文件读取出的字符串直接计算md5的结果和文件本身不一样,因为文件会自动在末尾加上`\n`,所以读取文件中字符串后也要给其加上一个`\n`
10. getObject里返回404——由于get请求行未匹配上
11. 编译出现未定义的引用
原因一定是在头文件中include后在编译阶段却找不到.o动态库文件,这时就需要去检查cmakelists里包含库的情况。
这里的问题在构建new_task的时候链接gtest_interface_server的时候出现,在函数ecos::RedisClient里,所以需要在CMakelists里把redis_client包含进来
![1568706837452](images/1568706837452.png)
```shell
set(GTEST_INTERFACE_SERVER_SRC
../src/core/config_opts.cc
../src/core/http_basic_handler.cc
../src/core/global.cc
../src/core/md5.cc
../src/core/heter_ec_pool.cc
../src/core/Buffer.cc
../src/core/ec_oper.cc
gtest_interface_server.cc
)
add_executable(gtest_interface_server ${GTEST_INTERFACE_SERVER_SRC})
target_link_libraries(gtest_interface_server
gtest
gflags
networking logger base pthread
redis_client
ec_jerasure
)
```
12. 如何接收文件——用req.body,是std::string格式
13. 如何向headers里插入新的headers——emplace VS insert
14. 端口设置问题,如何设置,用宏设置后用不了——解决
15. 单元测试xml需要解析吗——不需要,暂时用string模拟
16. 模拟校验md5的过程——无需
17. 单元测试的效果——校验返回状态码正确与否
18. 错误码——由metadataServer端条件判断返回(与amazon兼容),interfaceServer只需要照样返回即可。——不过目前制作功能性测试,不用关注错误码,只要跑通流程即可
1. 问问题
2. 封装“向headers里插入新的headers”的函数
3. 修改putbucket&剩下3个接口
4.
反馈
1. 加注释
2. 看http协议<http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9>.、[19.5.1](http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1).
# git
```shell
git pull origin master
#修改冲突文件
git add ./src/core/interface_server.cc
git commit -m "提交信息"
#注:“提交信息”里面换成你需要,如“first commit”
git push -u origin master
```
# md5sum
MD5是message-digest algorithm 5(信息-摘要算法)的缩写,被广泛用于加密和解密技术上,它可以说是文件的“数字指纹”。任何一个文件,无论是可执行程序、图像文件、临时文件或者其他任何类型的文件,也不管它体积多大,都有且只有一个独一无二的MD5信息值,并且如果这个文件被修改过,它的MD5值也将随之改变。因此,我们可以通过对比同一文件的MD5值,来校验这个文件是否被修改过。
在Linux中,用来计算文件和字符串的MD5值可以使用md5sum命令。
1.计算文件的MD5值:
命令:
md5sum 文件名 | cut -d ‘空格’' -f1
注:
(1)cut命令是为了截取第一列值,不追加cut命令除了MD5还会有文件名。
(2)文件名之前加目录也可以,只要是同一个文件,计算出来都是一致的。
2.计算字符串的MD5值:
命令:
echo -n '字符串' |md5sum|cut -d '空格 ' -f1
注:
(1)该命令一般用来计算文件地址的MD5值。
# 后续工作
把海洋的gtest的代码黏贴过来,修改一下,有xml的地方暂时写个虚拟的
关键是要根据所有可能的情况来写返回状态码,并且写单元测试测试对应的部分
# 使用redis测试
# 服务器部署
# 测试
使用python脚本进行测试
```shell
wget https://raw.githubusercontent.com/reorx/httpstat/master/httpstat.py
```
创建test目录生成所需大小的文件
```shell
mkdir ecos-test
cd ecos-test
dd if=/dev/zero of=5M.file bs=1M count=5
```
用脚本通过curl命令来上传和下载对象
```shell
python httpstat.py 219.223.193.179:8082/yyyBucket1/128M -X PUT -F "file=@/home/smc/ecos-test/128M.file"
python httpstat.py 219.223.193.179:8082/yyyBucket1/128M
python httpstat.py 172.18.9.22:8082/yyyBucket1/4k -X PUT -F "file=@/home/metadata/ecos-test/4k.file"
```