ecos学习过程

↘锁芯ラ 提交于 2019-12-01 12:42:48

# 看书
网络库

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.&amp; 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"


```





标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!